hdu 6053 TrickGCD [莫比乌斯函数]
2017-07-27 19:23
393 查看
题意:给出长度为n的A数列,求满足条件的B数组的个数,条件:①1<=b[i]<=a[i] ②对于任意区间【L,R】,区间gcd>=2
题解:对于某个数及其倍数能产生的B数组方案个数为:
但其中会产生重复的数列,这时候我们需要判断x的质因子数的奇偶性,若为奇数则加上该方案数,否则减去该方案数(容斥原理)
可以用莫比乌斯函数判断当前枚举的GCD对答案的贡献。
AC代码:
题解:对于某个数及其倍数能产生的B数组方案个数为:
但其中会产生重复的数列,这时候我们需要判断x的质因子数的奇偶性,若为奇数则加上该方案数,否则减去该方案数(容斥原理)
可以用莫比乌斯函数判断当前枚举的GCD对答案的贡献。
AC代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #define mod 1000000007 using namespace std; typedef long long ll; ll mu[100005],cas=1; ll num[200005]; void mobius(ll mn) { mu[1]=1; for(ll i=1;i<=mn;i++){ for(ll j=i+i;j<=mn;j+=i){ mu[j]-=mu[i]; } } } ll a[100005]; ll qmi(ll a,ll b) { ll ans=1; while(b) { if(b%2==1)ans=ans*a%mod; a=(a*a)%mod; b/=2; } return ans; } int main() { mobius(100000); ll T; scanf("%lld",&T); while(T--) { memset(num,0,sizeof(num)); ll n; scanf("%lld",&n); ll mi=100005; for(ll i=1;i<=n;i++) { scanf("%lld",&a[i]); mi=min(a[i],mi); } for(int i=1;i<=n;i++)num[a[i]]++; for(int i=1;i<=200000;i++)num[i]+=num[i-1]; ll sum=0; for(ll i=2;i<=mi;i++) { ll gg=1; for(ll j=1;j*i<=100000;j++) { gg=(gg*qmi(j,num[(j+1)*i-1]-num[(j)*i-1]))%mod; } sum=(sum-gg*mu[i]%mod+mod)%mod; } printf("Case #%lld: %lld\n",cas++,sum); } }
相关文章推荐
- HDU 6053 TrickGCD 【容斥定理】【莫比乌斯函数】
- HDU 6053 TrickGCD (莫比乌斯函数+分块筛)
- hdu 6053 TrickGCD [2017 Multi-University Training Contest - Team 2] [莫比乌斯函数]
- HDU 6053 TrickGCD (莫比乌斯函数)
- TrickGCD(HDU 6053 莫比乌斯函数的反演)
- TrickGCD HDU - 6053(莫比乌斯函数与容斥的关系)
- hdu 6053 TrickGCD 筛法+莫比乌斯函数+分块处理
- HDU 6053 TrickGCD (莫比乌斯函数)
- hdu 6053 TrickGCD(容斥,分段,莫比乌斯函数)
- HDU 6053 TrickGCD(莫比乌斯函数)
- Hdu-6053 TrickGCD(莫比乌斯函数)
- 【 hdu 6053】 TrickGCD 【数论 容斥 + 莫比乌斯函数 】
- 2017多校第二场 HDU 6053 TrickGCD 容斥,素数,思维
- HDU 6053 TrickGCD(枚举)
- 2017 Multi-University Training Contest - Team 2 1009 HDU 6053 TrickGCD(分段 容斥)
- hdu 6053 TrickGCD - 容斥原理 - 快速幂
- HDU 6053 TrickGCD(莫比乌斯反演+前缀和)
- hdu 6053 TrickGCD(莫比乌斯反演)
- HDU 6053 TrickGCD(分块+容斥)——2017 Multi-University Training Contest - Team 2
- HDU - 6053 TrickGCD(莫比乌斯反演+容斥思想+分块前缀和技巧)