LOj 2000「SDOI2017」数字表格 (莫比乌斯反演)
来源:互联网 发布:c语言多线程并行案例 编辑:程序博客网 时间:2024/06/07 23:52
题目链接:
LOj 2000
题意:
给你
让你求
题解:
因为要求:
枚举
ans(n,m)=∏min(n,m)k=1fib[k]∑⌊nk⌋i=1∑⌊mk⌋j=1[gcd(i,j)=1] 。
其中
利用莫比乌斯函数的性质,得到:
ans(n,m)=∏min(n,m)k=1fib[k]∑⌊nk⌋i=1∑⌊mk⌋j=1∑d|gcd(i,j)μ(d) 。
对每个
ans(n,m)=∏min(n,m)k=1fib[k]∑⌊min(n,m)k⌋d=1⌊nkd⌋⌊mkd⌋μ(d) 。
如果我们直接算这个,复杂度是
我们可以令
ans(n,m)=∏min(n,m)p=1∏k|pfib[k]⌊np⌋⌊mp⌋μ(pk)
=∏min(n,m)p=1(∏k|pfib[k]μ(pk))⌊np⌋⌊mp⌋ 。
(如果做得多了,其实可以直接推出上式,都是套路了。)
令
可以发现,发现对于每个
注意:
快速幂求答案的时候指数模一下mod−1 。因为 a(p−1)=1(mod p) p ,p 是质数,所以所有的指数是对(p−1) 取模的。如果这个点不注意,100分会卡成30分…
AC代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1000010;const int mod = 1e9+7; int tot=0;int check[N],mu[N],fib[N];int prime[N];int inv[N];int g[N],f[N];ll q_mod(ll a,ll b){ ll res = 1; while(b) { if(b&1) res=res*a%mod; b>>=1; a=a*a%mod; } return res;}void mobius(){ mu[1]=1; int n=1000005; for(int i=2;i<=n;i++) { if(!check[i]){ prime[++tot]=i; mu[i]=-1; } for(int j=1;j<=tot&&i*prime[j]<=n;j++) { check[i*prime[j]]=1; if(!(i%prime[j])) { mu[i*prime[j]]=0; break; } else mu[i*prime[j]]=-mu[i]; } } for(int i=0;i<=n;i++){ f[i]=g[i]=1; } fib[0]=0; fib[1]=1; for(int i=2;i<=n;i++) { fib[i]=fib[i-1]+fib[i-2]; if(fib[i]>=mod) fib[i]-=mod; } for(int i=2;i<=n;i++){ inv[i]=q_mod(fib[i],mod-2); } for(int i=3;i<=n;i++) { for(int j=i,k=1;j<=n;j+=i,k++) { if(mu[k]==1) { f[ j ] = 1LL * f[ j ] * fib[ i ] % mod; g[ j ] = 1LL * g[ j ] * inv[ i ] % mod; } else if(mu[k]==-1) { f[ j ] = 1LL * f[ j ] * inv[ i ] % mod; g[ j ] = 1LL * g[ j ] * fib[ i ] % mod; } } } for(int i=2;i<=n;i++){ f[i] = 1LL * f[i] * f[i-1] % mod; g[i] = 1LL * g[i] * g[i-1] % mod; }}int t,n,m;int solve(){ int ans = 1 ; for(int pos,i=1;i<=n;i=pos+1) { pos = min(n/(n/i),m/(m/i)); ans = 1LL * ans * q_mod( 1LL * f[pos] * g[i-1] % mod,1LL * (n/i) * (m/i) % (mod-1)) % mod; } //cout<<"ans="<<ans<<endl; return ans;}int main(){// freopen("product5.in","r",stdin); mobius();// cout<<"init finish"<<endl; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(n>m)swap(n,m); int ans = solve(); printf("%d\n",ans); } return 0;}
阅读全文
1 0
- LOj 2000「SDOI2017」数字表格 (莫比乌斯反演)
- loj #2000. 「SDOI2017」数字表格 (莫比乌斯)
- [BZOJ4816][SDOI2017]数字表格(莫比乌斯反演)
- bzoj 4816: [Sdoi2017]数字表格 莫比乌斯反演
- [莫比乌斯反演] BZOJ 4816 [Sdoi2017]数字表格
- [莫比乌斯反演] BZOJ4816: [Sdoi2017]数字表格
- [BZOJ2154]Crash的数字表格 && 莫比乌斯反演
- 【莫比乌斯反演】[BZOJ2154]Crash的数字表格
- 【bzoj2154】【Crash的数字表格】【莫比乌斯反演】
- 【莫比乌斯反演】BZOJ2154Crash的数字表格&BZOJ2693jzptab
- [数论][莫比乌斯反演] BZOJ 4816: 数字表格
- bzoj2154 Crash的数字表格(莫比乌斯反演)
- 【BZOJ2154】Crash的数字表格(莫比乌斯反演)(数学)
- 【bzoj 2154】Crash的数字表格(莫比乌斯反演)
- [BZOJ2154]Crash的数字表格(莫比乌斯反演)
- BZOJ 2154 Crash的数字表格(sigma(lcm(i,j)),莫比乌斯反演)
- 【BZOJ2154】Crash的数字表格,数论练习之二维LCM(莫比乌斯反演)
- BZOJ 2154 Crash的数字表格(莫比乌斯反演)
- R向量赋值和操作
- 洛谷P2303 [SDOi2012]Longge的问题
- hdu 6093 数位暴力
- jsp基础与提高(EL、JSTL)
- 在Hibernate中,@OneToMany单/双向外键关联
- LOj 2000「SDOI2017」数字表格 (莫比乌斯反演)
- python中的孤儿进程
- RNN之LSTM(3)
- Java学习经典案例
- 分布式事务-例子讲解
- 606. Construct String from Binary Tree
- IDEA快捷键设置成eclipse快捷键
- 洛谷P2516 [HAOI2010]最长公共子序列
- symbol类型