题目描述

  给你\(n,k,p\)(\(p\)为质数),求

\[\sum_{i=1}^n\frac{1}{i}\mod p^k
\]

  保证有解。

  \(p\leq {10}^5,np^k\leq {10}^{18}\)

题解

  为什么会有解?

  可能会发生这样的情况:

\[\begin{align}
&\sum_{i=1}^6\frac{1}{i}\mod 3\\
=&\frac{1}{1}+\frac{1}{2}+\frac{1}{4}+\frac{1}{5}+\frac{1}{3}+\frac{1}{6}\mod 3\\
=&\frac{1}{1}+\frac{1}{2}+\frac{1}{4}+\frac{1}{5}+\frac{1}{2}\mod 3\\
=&\cdots
\end{align}
\]

  因为几个分母是\(p\)的倍数的数的逆元加起来后分子可能会变成\(p\)的倍数然后就约掉了。

  令

\[\begin{align}
f(n)&=\sum_{i=1}^n\frac{1}{i}\\
g(n)&=\sum_{i=1,i\neq jp}^n\frac{1}{i}
\end{align}
\]

  那么

\[f(n)=g(n)+\frac{f(\lfloor\frac{n}{p}\rfloor)}{p}
\]

  因为我们的答案要对\(p^k\)取模,所以\(f(\lfloor\frac{n}{p}\rfloor)\)在计算的时候要对\(p^{k+1}\)取模,才能得到正确答案。

\[\begin{align}
g(n)&=\sum_{i=a+bp}^{n}\frac{1}{i}\\
&=\sum_{a=1}^{p-1}\sum_{b=0}^{\lfloor\frac{n-a}{p}\rfloor}\frac{1}{a+bp}\\
&=\sum_{a=1}^{p-1}\sum_{b=0}^{\lfloor\frac{n-a}{p}\rfloor}a^{-1}\sum_{i=0}^{k-1}{(-1)}^i\frac{b^i}{a^i}p^i\\
&=\sum_{i=0}^{k-1}{(-1)}^ip^i\sum_{a=1}^{p-1}\frac{1}{a^{i+1}}\sum_{b=0}^{\lfloor\frac{n-a}{p}\rfloor}b^i
\end{align}
\]

  这时候要算自然数幂和,但我们不能线性插值。

  那就大力推一波公式吧。

  \(s_s(n,m)\) 为带符号第一类斯特林数。

\[\begin{align}
S_k(n)&=\sum_{i=1}^ni^k\\
x^\underline{n}&=\sum_{k=0}^ns_s(n,k)x^k\\
k!\binom{n}{k}&=n^\underline{k}\\
i^k&=s_s(k,k)i^k\\
i^k&=k!\binom{i}{k}-i^\underline{k}+s_s(k,k)i^k\\
i^k&=k!\binom{i}{k}-(i^\underline{k}-s_s(k,k)i^k)\\
i^\underline{k}-s_s(k,k)i^k&=\sum_{j=0}^ks_s(k,j)i^j-s_s(k,k)i^k\\
&=\sum_{j=0}^{k-1}s_s(k,j)i^j\\
i^k&=k!\binom{i}{k}-\sum_{j=0}^{k-1}s_s(k,j)i^j\\
S_k(n)&=\sum_{i=0}^{n}(k!\binom{i}{k}-\sum_{j=0}^{k-1}s_s(k,j)i^j)\\
&=\sum_{i=0}^nk!\binom{i}{k}-\sum_{j=0}^{k-1}s_s(k,j)\sum_{i=0}^ni^j\\
&=k!\binom{n+1}{k+1}-\sum_{i=0}^{k-1}s_s(k,i)S_j(n)\\
&=\frac{{(n+1)}^\underline{k+1}}{k+1}-\sum_{i=0}^{k-1}s_s(k,i)S_j(n)
\end{align}
\]

  还有一种方法

\[\begin{align}
S_m(n)&=\sum_{i=1}^ni^m\\
&=\sum_{i=1}^n\sum_{j=1}^m\begin{Bmatrix}m\\j\end{Bmatrix}i^\underline{j}\\
&=\sum_{j=1}^m\begin{Bmatrix}m\\j\end{Bmatrix}\sum_{i=1}^ni^\underline{j}\\
&=\sum_{j=1}^m\begin{Bmatrix}m\\j\end{Bmatrix}\frac{{(n+1)}^\underline{j+1}}{j+1}
\end{align}
\]

  预处理出斯特林数就可以快速算\(S_k(n)\)了。

  你可能会注意到,\(\frac{{(n+1)}^\underline{k+1}}{k+1}\)有除法。

  但是分子是\(k+1\)个连续的自然数幂的乘积,一定有一个是\(k+1\)的倍数,这样就可以消除分母的影响。

  算\(g\)的话,每层是\(O(kp)\)的,一共有\(O(\log_pn)\)层,所以总时间复杂度是\(O(kp\log_pn)\)。

  乘法取模可以用快速乘(多一个\(\log\)),也可以用黑科技,我偷懒用了int128。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef __int128 lll;
ll p;
ll mul(ll a,ll b,const ll c)
{
return (lll)a*b%c;
}
ll fp(ll a,ll b){ll s=1;for(;b;b>>=1,a*=a)if(b&1)s*=a;return s;}
ll fp(ll a,ll b,const ll c){ll s=1;for(;b;b>>=1,a=mul(a,a,c))if(b&1)s=mul(s,a,c);return s;}
int pri[1000010];
int b[1000010];
ll pw[1000010];
int cnt;
ll ss[100][100];
void getstirling(ll k,ll md)
{
ss[0][0]=1;
for(int i=1;i<=k;i++)
for(int j=1;j<=i;j++)
ss[i][j]=(ss[i-1][j-1]-mul(i-1,ss[i-1][j],md))%md;
}
ll gao(ll n,ll k,ll md)
{
ll s=(n+1)/(k+1);
ll v=s*(k+1);
for(ll i=n+1;i>=n-k+1;i--)
s=mul(s,(i==v?1:i),md);
return s;
}
void gets(ll *s,ll n,ll k,ll md)
{
s[0]=n;
for(int i=1;i<=k;i++)
{
s[i]=gao(n,i,md);
for(int j=0;j<i;j++)
s[i]=(s[i]-mul(ss[i][j],s[j],md))%md;
}
s[0]++;
}
ll s1[100];
ll s2[100];
ll g(ll n,ll md,ll k)
{
ll r=n%p;
getstirling(k,md);
gets(s1,n/p-1,k,md);
gets(s2,n/p,k,md);
ll res=0,s;
ll t=fp(p,k)-fp(p,k-1)-1;
for(int i=0;i<k;i++)
{
s=0;
pw[1]=1;
cnt=0;
for(int j=1;j<p;j++)
b[j]=0;
for(int j=2;j<p;j++)
{
if(!b[j])
{
pri[++cnt]=j;
pw[j]=fp(fp(j,i+1),t,md);
}
for(int k=1;k<=cnt&&j*pri[k]<p;k++)
{
b[j*pri[k]]=1;
pw[j*pri[k]]=mul(pw[j],pw[pri[k]],md);
if(j%pri[k]==0)
break;
}
}
if(n%p==0)
for(int j=1;j<p;j++)
s=(s+mul(s1[i],pw[j],md))%md;
else
for(int j=1;j<p;j++)
if(j<=r)
s=(s+mul(s2[i],pw[j],md))%md;
else
s=(s+mul(s1[i],pw[j],md))%md;
s=mul(s*(i&1?-1:1),fp(p,i),md);
res=(res+s)%md;
}
// fprintf(stderr,"G(%lld, %lld) = %lld\n",n,md,(res+md)%md);
return res;
}
ll f(ll n,ll md,ll k)
{
if(!n)
return 0;
return (g(n,md,k)+f(n/p,md*p,k+1)/p)%md;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
ll n,k;
scanf("%lld%lld%lld",&p,&k,&n);
ll md=fp(p,k);
ll ans=f(n,md,k);
ans=(ans+md)%md;
printf("%lld\n",ans);
return 0;
}

【XSY1515】【GDKOI2016】小学生数学题 组合数学的更多相关文章

  1. [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$ 那么 ...

  2. [xsy1515]小学生数学题

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

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

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

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

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

  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. python中读取文件的read、readline、readlines方法区别

    #读取文件所有内容,返回字符串对象,python默认以文本方式读取文件,遇到结束符读取结束. fr = open('lenses.txt')read = fr.read()print(type(rea ...

  2. 培训班课程课时及费用管理系统V3.0,适合钢琴培训班、艺术培训班等

    联系QQ 564955427. ACM3.02 文件下载                    还有: 预收课时版 特点: 1. 适合主要业务是一对一课程和部分集体课培训的中小培训班(非连锁管理).考 ...

  3. iOS UICollectionView 在滚动时停在某个item位置上

    方法一:实现UIScrollView的代理,然后实现下面这个方法 #pragma mark - UIScrollViewDelegate//预计出大概位置,经过精确定位获得准备位置- (void)sc ...

  4. Vue之子组件

    全局组件 <script src="./static/vue.min.js"></script> // 导入vue <body> <div ...

  5. Python_内置函数之max

    源码: def max(*args, key=None): # known special case of max """ max(iterable, *[, defau ...

  6. jmeter压测

    一般压测时间:10-15分钟   这些并发用户一直在请求. 稳定性测试:一周  2天 衡量性能好坏的指标: tps 服务端每秒钟能处理的请求数 rt响应时间 就是你从发出请求到服务器端返回所需的时间. ...

  7. 【问题解决方案】本地代码文件上传到GitHub里中文乱码问题

    刚刚学完Git并试着上传了我的化石Java代码到远程库,表面一切和谐,然而.. 真让人大惊失色.. step1-检查浏览器是否是utf-8(谷歌默认是) step2-在本地编辑器设置 (按理说,not ...

  8. ssm项目跨域访问

    最近使用ssm开发了一个项目,为了项目的开发速度,采用的是前后端同时开发,所以前端文件没有集成在项目中,最后在调试时涉及到了跨域.跨域的解决方法很多,我采用的是最简单的一种,代码如下: 新建一个过滤器 ...

  9. 1363. ZigZag Conversion

    public class Solution { /** * @param s: the given string * @param numRows: the number of rows * @ret ...

  10. POJ_1185_炮兵阵地 dp+状态压缩

    题目:炮兵阵地 链接:http://poj.org/problem?id=1185 解题思路: 首先用 int 来表示每一行的情况,比如说第一行是k1,那么[ k1&(k1>>2) ...