$F(n)=\sum\limits_{i=1}^{n}i^{-1}$

$G(n)=\sum\limits_{i=1,i\neq jp}^{n}i^{-1}$

我们要算$F(n)\%p^k$

那么

$F(n)\%p^k=\frac{F( \left \lfloor \frac{n}{p} \right \rfloor )}{p}\%p^k+G(n)\%p^k$

我们知道$\frac{F( \left \lfloor \frac{n}{p} \right \rfloor )}{p}\%p^k=\frac{F( \left \lfloor \frac{n}{p} \right \rfloor )\%p^{k+1}}{p}$,其中$F( \left \lfloor \frac{n}{p} \right \rfloor )\%p^{k+1}$可以可以递归算,所以我们重点要考虑的是$G(n)\%p^k$

不妨设$p|n$,那么

$G(n)\%p^k=\sum\limits_{a=1}^{p-1}\sum\limits_{b=0}^{\left \lfloor \frac{n}{p} \right \rfloor -1}(a+bp)^{-1}\%p^k$

用广义二项式定理展开:

$(a+bp)^{-1}=\sum\limits_{i=0}^{oo}C_{-1}^{i}a^{-1-i}b^ip^i=\sum\limits_{i=0}^{oo}(-1)^ia^{-1-i}b^ip^i$

又因为是在模$p^k$意义下的,所以

$(a+bp)^{-1}\%p^k=\sum\limits_{i=0}^{k-1}(-1)^ia^{-1-i}b^ip^i\%p^k$

所以

$G(n)\%p^k=\sum\limits_{a=1}^{p-1}\sum\limits_{b=0}^{\left \lfloor \frac{n}{p} \right \rfloor -1}\sum\limits_{i=0}^{k-1}(-1)^ia^{-1-i}b^ip^i\%p^k$

$=\sum\limits_{i=0}^{k-1}(-1)^ip^i\sum\limits_{a=1}^{p-1}a^{-1-i}\sum\limits_{b=0}^{\left \lfloor \frac{n}{p} \right \rfloor -1}b^i\%p^k$

需要注意的一点是,用二项式定理的时候,规定$0^0=1$

我们枚举$i$和$a$,要$O(kp)$的时间复杂度;剩下的$\sum\limits_{b=0}^{\left \lfloor \frac{n}{p} \right \rfloor -1}b^i\%p^k$就是自然数幂和,记$S_{i}(n)=\sum\limits_{b=0}^{n}b^i\%p^k$,可以用$O(k^2)$的时间内预处理出所有的$S_{i}(\left \lfloor \frac{n}{p} \right \rfloor-1)\%p^k(0\leq i\leq k-1)$

如果$n$不是$p$的倍数,剩下的零头乱搞就行了

所以每递归一次的时间复杂度是$O(kp+k^2)$

所以总的时间复杂度是$O(log_{p}n(kp+k^2))$

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<cassert>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i]) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const LL maxp=;
const LL maxk=; LL multiply(LL a,LL b,LL MOD)
{
LL t=(LL)((DB)a*b/MOD);
return a*b-t*MOD;
} LL su[maxk][maxk],sb[maxk];
void calc(LL n,LL d,LL m)
{
LL i,j;
su[][]=;
re(i,,d)
{
su[i][]=;
re(j,,d-)su[i][j]=(multiply(i-,su[i-][j],m)+su[i-][j-])%m;
su[i][i]=;
}
sb[]=n%m;
re(i,,d)
{
sb[i]=;
red(j,n+,n+-i)if(j%(i+)==)sb[i]=multiply(sb[i],j/(i+),m); else sb[i]=multiply(sb[i],j,m);
LL l=(i%==)?:-;
re(j,,i-){(sb[i]-=l*multiply(su[i][j],sb[j],m))%=m;l=-l;}
}
} LL reva[maxp],powreva[maxp]; LL F(LL n,LL p,LL k,LL m)
{
LL i,j,res=;
if(n<p)
{
reva[]=;re(j,,n)reva[j]=multiply(reva[m%j],(m-m/j),m);
re(j,,n)(res+=reva[j])%=m;
return res;
}
calc(n/p-,k-,m);
(sb[]+=)%=m;
reva[]=;re(j,,p-)reva[j]=multiply(reva[m%j],(m-m/j),m);
re(j,,p-)powreva[j]=;
LL sp=,sa;
re(i,,k-)
{
sa=;
re(j,,p-)powreva[j]=multiply(powreva[j],reva[j],m),(sa+=powreva[j])%=m;
(res+=multiply(multiply(sp,sa,m),sb[i],m))%=m;
sp=multiply(sp,-p,m);
}
if(n%p!=)
{
re(j,,n%p)powreva[j]=;
LL sp=,sa;
re(i,,k-)
{
sa=;
re(j,,n%p)powreva[j]=multiply(powreva[j],reva[j],m),(sa+=powreva[j])%=m;
(res+=multiply(sp,sa,m))%=m;
sp=multiply(sp,(-p)*(n/p),m);
}
}
(res+=F(n/p,p,k+,m*p)/p)%=m;
return res;
} int main()
{
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
LL i,p=gll(),k=gll(),n=gll(),m=;re(i,,k)m*=p;
cout<<(F(n,p,k,m)%m+m)%m<<endl;
return ;
}

[GDKOI2016]小学生数学题的更多相关文章

  1. 【XSY1515】【GDKOI2016】小学生数学题 组合数学

    题目描述 给你\(n,k,p\)(\(p\)为质数),求 \[ \sum_{i=1}^n\frac{1}{i}\mod p^k \] 保证有解. \(p\leq {10}^5,np^k\leq {10 ...

  2. python笔记1-用python解决小学生数学题

    前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为6角,7角,8角,请问你最大的不可支付邮资是多少元? 小编掰着手指头和脚趾头算了下,答案是:1.7元 那么问题来了?为啥是1.7 ...

  3. python笔记-用python解决小学生数学题【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为 ...

  4. [xsy1515]小学生数学题

    题意:求$\begin{align*}\left(\sum\limits_{i=1}^n\dfrac 1i\right)\%\ p^k\end{align*}$ 数学真是太可爱了== 直接推公式 设$ ...

  5. GDKOI2016 游记

    2016.2.19~2.15强行广州koi被虐…… DAY 0 19日下午到达,第六次入住中大西苑宾馆,怂逼抽签抽中外交大使特殊职位,然后就一边看<死神>一边等石门两位室友啦.必须吐槽宾馆 ...

  6. GDKOI2016总结——被虐之旅

    前言 一个被虐的旅程... 这次GDKOI的比赛虽然基本全上暴力,但是居然只有两道题得了分:30+30=60!我感觉整个人都不好了... day0 在去广州的路上,本来心情很好,但是坐在我斜后面的那位 ...

  7. GDKOI 2016

    GDKOI 2016 day 1 第一题 魔卡少女 题目描述:维护一个序列,能进行以下两个操作:1.将某一个位置的值改变.2.求区间的连续子串的异或值的和. solution 因为序列的数的值都小于\ ...

  8. 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛题解

    链接:https://www.nowcoder.com/acm/contest/118/A 来源:牛客网 PUBG 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

  9. GDOI2017 再次酱油记

    Day 0 13:00 pm 啊...今天中午一点钟从ez出发,感觉吼有趣啊.出发前先大喊一声****,在书包里放一本党史,感觉玄学可以救命[滑稽] 15:00 pm 到达东莞,坐标:石龙名冠金凯悦大 ...

随机推荐

  1. [AWS] Install the AWS cli

    On Windows, just download the installer and install it. Configure: aws configure In your aws console ...

  2. [Angular 2] Pipe Purity

    Explaining how Pipes only change by default when your Pipe input parameters change and not when your ...

  3. KMP和扩展KMP【转】

    这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP 给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i ...

  4. c# json数据解析——将字符串json格式数据转换成对象

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...

  5. Django Errors Archive

    记录使用 Django 开发中遇到的问题,备用 1. 版本要选好,最好安装上 pip,可以省很多麻烦 2. 如果使用 Postgresql,选 8.1 之后的版本,免去 Retruning 之类的错误 ...

  6. JS操作DOM元素属性和方法

    Dom元素基本操作方法API,先记录下,方便以后使用. W3C DOM和JavaScript很容易混淆不清.DOM是面向HTML和XML文档的API,为文档提供了结构化表示,并定义了如何通过脚本来访 ...

  7. ecshop首页调用指定商品分类下的商品品牌列表

    转之--http://www.16css.com/ecshop/735.html 通过二次开发可以实现ECSHOP首页调用指定分类下的品牌列表. 第一步: 打开根目录下的index.php 在最后面 ...

  8. DOM中的node与element的区别

    先看document的两个常见method. document.createTextNode Constructor: Text document.createElement Constructor: ...

  9. tomcat中有关配置文件的说明

    在以往的tomcat使用中本人一直都没有注意到tomcat的conf目录下配置文件的作用,都是"拿来主义"的思想,从未深究.但是最近遇到很多有关tomcat配置的问题,很是头大,所 ...

  10. PHP PDO 简单登陆操作

    用PHP做出一个简单的登陆操作,确实很简单,下面就让我给大家简单的介绍一下PDO做出一个登陆界面操作的过程,因为也是初学乍练,不足之处请大家包涵. 首先,首先还要建一个表,在MySQL中建表,核心代码 ...