bzoj 4407: 于神之怒加强版 (反演+线性筛)
来源:互联网 发布:高级数据安全工程师 编辑:程序博客网 时间:2024/05/20 19:17
题目描述
传送门
题目大意:
题解
一道非常不错的莫比乌斯反演,想了一晚啊。。。。
首先引入反演的两个公式
(1)如果
(2)如果
那么反演有什么用呢?可以实现F(n),f(n)之间的转换求解,使不易求的式子转化成易求的形式。
最常见的应用就是
那么对于这道题来说我们先对式子进行改动,设
设
显然
利用反演公式(2),可以得到
注意
所以对于枚举的d来说,最大的倍数只能是min(n,m).
设
所以当a,b互质的时候,我们可以利用积性函数的性质
关键是a,b不互质的时候怎么求解。
那么对于一个质因数来书,
那么对于函数h我们就可用线性筛进行预处理,利用的时候直接
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 5000000#define p 1000000007#define LL long longusing namespace std;LL f[N+3],g[N+3];int n,m,k,T,pd[N+3],prime[N+3];LL quickpow(LL num,int x){ LL ans=1; LL base=num%p; while (x) { if (x&1) ans=base*ans%p; x>>=1; base=base*base%p; } return ans;}void init(){ f[1]=1; for (int i=2;i<=N;i++) { if (!pd[i]) { prime[++prime[0]]=i; g[prime[0]]=quickpow(i,k); f[i]=(g[prime[0]]-1+p)%p; } for (int j=1;j<=prime[0];j++) { if (i*prime[j]>N) break; pd[i*prime[j]]=1; if (i%prime[j]==0) { f[i*prime[j]]=f[i]*g[j]%p; break; } else f[i*prime[j]]=f[i]*f[prime[j]]%p; } } for (int i=1;i<=N;i++) f[i]=(f[i-1]+f[i])%p; //for (int i=1;i<=10;i++) cout<<f[i]<<" "; //cout<<endl;}int main(){ freopen("a.in","r",stdin); scanf("%d%d",&T,&k); init(); while (T--) { scanf("%d%d",&n,&m); if (n>m) swap(n,m); int j=0; LL ans=0; for (int i=1;i<=n;i=j+1) { j=min(n/(n/i),m/(m/i)); j=min(j,n); LL t=(LL)(n/i)*(m/i)%p; ans=(ans+(LL)t*(f[j]-f[i-1]+p)%p)%p; } printf("%I64d\n",(ans%p+p)%p); }}
0 0
- bzoj 4407: 于神之怒加强版 (反演+线性筛)
- bzoj4407 于神之怒加强版(莫比乌斯反演+线性筛)
- 4407: 于神之怒加强版 莫比乌斯反演+线性筛积性函数
- BZOJ 4407: 于神之怒加强版|莫比乌斯反演
- bzoj 4407: 于神之怒加强版 莫比乌斯反演
- [莫比乌斯反演 积性函数前缀和] BZOJ 4407 于神之怒加强版
- 于神之怒加强版 [Bzoj 4407]
- bzoj 4407 于神之怒加强版
- bzoj 4407: 于神之怒加强版
- [BZOJ4407]于神之怒加强版(莫比乌斯反演)
- 莫比乌斯进阶:bzoj 4407 于神之怒加强版(Mobius)
- 【BZOJ】【P4407】【于神之怒加强版】【题解】【数论】
- BZOJ_P4407 于神之怒加强版(数论+莫比乌斯反演)
- 【bzoj4407】【于神之怒加强版】【莫比乌斯反演】
- 4407: 于神之怒加强版
- BZOJ4407: 于神之怒加强版
- 【BZOJ4407】于神之怒加强版
- 于神之怒加强版[bzoj4407]
- 数媒笔记整理4
- 【SSH网上商城项目实战14】商城首页UI的设计
- 客户端连接不上Azure和腾讯云服务器里跑的代码
- 1093
- C++中的构造函数+拷贝构造函数+析构函数
- bzoj 4407: 于神之怒加强版 (反演+线性筛)
- C++Win764x下做掉PatchGuard教程
- 设置tomcat直接让某个文件夹代替ROOT
- ascii码,unicode码,utf-8码
- 坚持#第148天~请遵守每天作息规律养成良好习惯
- 鸟哥的linux私房菜学习笔记《三十二》RAID软件磁盘阵列
- 1094
- 线程基础总结
- 进程控制编程