CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
正題
題目鏈接:https://www.luogu.com.cn/problem/CF585E
題目大意
給出一個大小為nnn的可重集TTT,求有多少個它的非空子集SSS和元素xxx滿足
x?S,gcd{S}>1,gcd(S,x)=1x\notin S,gcd\{S\}>1,gcd(S,x)=1x∈/?S,gcd{S}>1,gcd(S,x)=1
1≤n≤5×1051\leq n\leq 5\times 10^51≤n≤5×105,值域范圍是[2,107][2,10^7][2,107]
解題思路
x?Sx\notin Sx∈/?S這個條件是沒有用的,可以去掉
然后設fif_ifi?表示與iii互質(zhì)的數(shù)的個數(shù),sis_isi?表示gcdgcdgcd為iii的集合個數(shù),那么答案就是∑fisi\sum f_is_i∑fi?si?
然后設cic_ici?表示iii的個數(shù)
fi=∑d∣inμ(d)∑d∣jcjf_i=\sum_{d|i}^n\mu(d)\sum_{d|j}c_jfi?=d∣i∑n?μ(d)d∣j∑?cj?
然后可以處理出一個gd=∑d∣jcjg_d=\sum_{d|j}c_jgd?=∑d∣j?cj?就可以了。
然后考慮sis_isi?怎么處理
si=2ci?1?∑i∣d(2cd?1)s_i=2^{c_i}-1-\sum_{i|d}(2^{c_d}-1)si?=2ci??1?i∣d∑?(2cd??1)
就好了。
然后這些都可以用狄利克雷前綴/后綴和O(nlog?log?n)O(n\log \log n)O(nloglogn)求
code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e7+1,P=1e9+7; int n,cnt,pri[N],mu[N],f[N],s[N],pw[N],ans; bool v[N]; int main() {mu[1]=1;for(int i=2;i<N;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}scanf("%d",&n);for(int i=1;i<=n;i++){int x;scanf("%d",&x);f[x]++;;}pw[0]=1;for(int i=1;i<N;i++)pw[i]=pw[i-1]*2ll%P;for(int j=1;j<=cnt;j++)for(int i=N/pri[j];i>=1;i--)f[i]+=f[i*pri[j]];for(int i=1;i<N;i++)s[i]=pw[f[i]]-1;for(int i=1;i<N;i++)f[i]=f[i]*mu[i];for(int j=cnt;j>=1;j--)for(int i=1;i*pri[j]<N;i++)f[i*pri[j]]+=f[i];for(int j=cnt;j>=1;j--)for(int i=1;i*pri[j]<N;i++)(s[i]-=s[i*pri[j]])%=P;for(int i=2;i<N;i++)(ans+=1ll*f[i]*s[i]%P)%=P;printf("%d\n",(ans+P)%P);return 0; }總結(jié)
以上是生活随笔為你收集整理的CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比特币电脑配置多少钱(比特币 电脑配置)
- 下一篇: 上古卷轴对电脑配置要求(上古卷轴对电脑配