通过这道题学了伯努利数,写篇题解推一下

题目

先推一下式子

\[\sum_{i=1}^ni^d[gcd(i,n)=1]
\]
\[\sum_{i=1}^{n}i^d\sum_{k|i}\sum_{k|n}\mu(k)
\]
\[\sum_{k|n}\mu(k)\sum_{i=1}^{\frac{n}{k}}(ik)^d
\]
\[\sum_{k|n}\mu(k)k^d\sum_{i=1}^{\frac{n}{k}}i^d
\]

我们发现这个东西不好预处理,那么我们再简化一下。

设 \(S_k(n)=\sum_{i=1}^{n-1}i^k\)

则原式等于

\[\sum_{k|n}\mu(k)k^d(S_d(\frac{n}{k})+(\frac{n}{k})^d)
\]
\[\sum_{k|n}\mu(k)k^dS_d(\frac{n}{k})+\sum_{k|n}\mu(k)n^d
\]

\(\sum_{k|n}\mu(k)\) 等价与 \([n=1]\),而本题中 \(n\) 不可能为 \(1\),所以原式为

\[\sum_{k|n}\mu(k)k^dS_d(\frac{n}{k})
\]

设 \(f_i\) 为在伯努利公式中 \(i\) 次幂的系数

\[\sum_{k|n}\mu(k)k^d\sum_{i=1}^{d+1}f_i(\frac{n}{k})^i
\]
\[\sum_{k|n}\mu(k)\sum_{i=1}^{d+1}f_in^ik^{d-i}
\]
\[\sum_{i=1}^{d+1}f_in^i\sum_{k|n}\mu(k)k^{d-i}
\]

我们会发现式子后半部分就是 \((\mu×id_{d-i})*I\),所以肯定是一个积性函数。

设 \(F(n)=\sum_{k|n}\mu(k)k^{d-i},G(p)=\mu(p)p^{d-i},F(n)=\sum_{p|n}G(p)\)

考虑质数取值:

\[G(p)=\left\{
\begin{array}{lcl}
1\kern 2.2em(p=1)\\
-p^{d-i}\kern 1.0em(p\in prime)\\
\end{array}
\right.
\]

由 \(\mu\) 的性质,可以得出上式当 \(n\in prime\) 时,\(F(n)=1-n^{d-i}\)

所以总的复杂度即为 \(O(d^2+dw)\),\(d^2\) 为预处理 \(f_i\) 。

\(AC \kern 0.4emCODE:\)

#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
const int MOD=1e9+7,W=1010,D=107;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
inline int fpow(int x,int y) {
int res=1;
while(y) {
if (y&1) res=1ll*res*x%MOD;
x=1ll*x*x%MOD;y>>=1;
}
return res;
}
inline int inv(int x) {return fpow(x,MOD-2);}
int frac[D],invf[D];
void init(int k) {
frac[0]=1;
for (ri i(1);i<=k;p(i)) frac[i]=1ll*frac[i-1]*i%MOD;
invf[k]=inv(frac[k]);
for (ri i(k);i;--i) invf[i-1]=1ll*invf[i]*i%MOD;
}
inline int C(int n,int m) {return 1ll*frac[n]*invf[m]%MOD*invf[n-m]%MOD;}
struct Bernou{
int B[D],f[D];
inline void Bernoulli(int k) {
B[0]=1;
for (ri i(1);i<=k;p(i)) {
int sum=0;
for (ri j(0);j<i;p(j)) sum=(sum+1ll*C(i+1,j)*B[j]%MOD)%MOD;
B[i]=(0-1ll*sum*inv(i+1)%MOD+MOD)%MOD;
}
int INV=inv(k+1);
for (ri i(0);i<=k;p(i)) f[k+1-i]=1ll*C(k+1,i)*B[i]%MOD*INV%MOD;
}
}B;
int d,w,p[W],a[W];
inline int Sum(int cm) {
if (cm<0) cm=MOD-2;
int res=1;
for (ri i(1);i<=w;p(i)) res=1ll*res*(1-fpow(p[i],cm)+MOD)%MOD;
return res;
}
int main() {
d=read(),w=read();
init(d+3);B.Bernoulli(d);
for (ri i(1);i<=w;p(i)) p[i]=read(),a[i]=read();
int ans=0,n=1;
for (ri i(1);i<=w;p(i)) n=1ll*n*fpow(p[i],a[i])%MOD;
for (ri i(1),cm(1);i<=d+1;p(i)) {
cm=1ll*cm*n%MOD;
ans=(ans+1ll*B.f[i]*cm%MOD*Sum(d-i)%MOD)%MOD;
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. Python(七)Socket编程、IO多路复用、SocketServer
  2. VMware ubuntu中执行python文件的操作小结
  3. C#设计模式之组合
  4. IOS播放音乐和音效
  5. 无法从“object”转换为“string”
  6. (转)apache的keepalive和keepalivetimeout(apache优化)
  7. 理解JavaScript 的原型属性
  8. Oracle单表的复杂查询
  9. js基础 2
  10. 常用string格式化
  11. httpd服务器的真实ip获取难题
  12. 如何将数据库引擎配置为侦听多个 TCP 端口
  13. Java网络通信方面,BIO、NIO、AIO、Netty
  14. 【Semantic Segmentation】DeepLab V3(转)
  15. Wannafly挑战赛14E无效位置
  16. Linux/Unix监控工具vmstat命令
  17. PHPStorm等编辑器debug调试(包括使用postman、soapUI)
  18. 使用TextView/EditText应该注意的地方,监听EditText,addTextChangedListener
  19. DRF基类APIView的子类GenericAPIView
  20. Ionic2 常见问题及解决方案

热门文章

  1. 合并两个有序链表---python
  2. 使用微服务Blog.Core开源框架的一些坑
  3. 315M、433M和2.4G笔记
  4. 通过原生js实现数据的双向绑定
  5. POJ 博弈论
  6. Redis学习——常用小功能
  7. vue2.x移动端ui框架选型
  8. Echarts入门踩坑记录
  9. python + pytest基本使用方法(运行测试&amp;测试报告)
  10. Python Unittest简明教程