[GDKOI2016]小学生数学题
记
$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]小学生数学题的更多相关文章
- 【XSY1515】【GDKOI2016】小学生数学题 组合数学
题目描述 给你\(n,k,p\)(\(p\)为质数),求 \[ \sum_{i=1}^n\frac{1}{i}\mod p^k \] 保证有解. \(p\leq {10}^5,np^k\leq {10 ...
- python笔记1-用python解决小学生数学题
前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为6角,7角,8角,请问你最大的不可支付邮资是多少元? 小编掰着手指头和脚趾头算了下,答案是:1.7元 那么问题来了?为啥是1.7 ...
- python笔记-用python解决小学生数学题【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为 ...
- [xsy1515]小学生数学题
题意:求$\begin{align*}\left(\sum\limits_{i=1}^n\dfrac 1i\right)\%\ p^k\end{align*}$ 数学真是太可爱了== 直接推公式 设$ ...
- GDKOI2016 游记
2016.2.19~2.15强行广州koi被虐…… DAY 0 19日下午到达,第六次入住中大西苑宾馆,怂逼抽签抽中外交大使特殊职位,然后就一边看<死神>一边等石门两位室友啦.必须吐槽宾馆 ...
- GDKOI2016总结——被虐之旅
前言 一个被虐的旅程... 这次GDKOI的比赛虽然基本全上暴力,但是居然只有两道题得了分:30+30=60!我感觉整个人都不好了... day0 在去广州的路上,本来心情很好,但是坐在我斜后面的那位 ...
- GDKOI 2016
GDKOI 2016 day 1 第一题 魔卡少女 题目描述:维护一个序列,能进行以下两个操作:1.将某一个位置的值改变.2.求区间的连续子串的异或值的和. solution 因为序列的数的值都小于\ ...
- 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛题解
链接:https://www.nowcoder.com/acm/contest/118/A 来源:牛客网 PUBG 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...
- GDOI2017 再次酱油记
Day 0 13:00 pm 啊...今天中午一点钟从ez出发,感觉吼有趣啊.出发前先大喊一声****,在书包里放一本党史,感觉玄学可以救命[滑稽] 15:00 pm 到达东莞,坐标:石龙名冠金凯悦大 ...
随机推荐
- iOS 开发-单元测试
前言 维基百科对单元测试的定义如下: 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可 ...
- C# 读取XML文件示例
有关XML文件编写规范,请参考:http://www.w3school.com.cn/xml/index.aspXML内容如下(文件名为:Information.xml):浏览器显示: <?xm ...
- 关于Linux的缓存内存 Cache Memory详解<转>
转自 http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存 ...
- ST表poj3264
/* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans ...
- css标签选择器
/*标签选择器*/ input[type="text"] { width: 60%; } </style>
- asp.net 图片质量压缩(不改变尺寸)
private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCodecInfo[] encoders; en ...
- 10_RHEL安装搜狗输入法
首先需要安装相关源 1.加入EPEL源 EPEL7几乎是必备的源: $ sudo yum install epel-release 2.添加mosquito-myrepo源 mosquito-myre ...
- 关于表单的jQuery练习
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- DropDownList自动生成年月日
DropDownList自动生成年月日 aspx页面上有三个dropdownlist控件, dropdownlist1 表示年,dropdownlist2表示月,dropdownlist3表示天: 注 ...
- 无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。
引用里找到Microsoft.Office.Interop.Word右键属性 在嵌入互操作类型里,选上False就行了.