1. 程式人生 > >hdu 5212 反向容斥或者莫比

hdu 5212 反向容斥或者莫比

esp fine max 反向 ios amp end ans logs

http://acm.hdu.edu.cn/showproblem.php?pid=5212

題意:忽略。。

題解:把題目轉化為求每個gcd的貢獻。(http://www.cnblogs.com/z1141000271/p/7419717.html 和這題類似 反向容斥)這裏先用容斥寫了,mobious的之後再說吧23333。

然後比較想說的是這個調和級數的復雜度 nlog(n)

ac代碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define
mt(a) memset(a,0,sizeof(a)) using namespace std; const int mod=10007; typedef long long ll; ll a[10001]; ll num[10001]; ll cnt[10001]; ll get(ll n) { int f=1; f=n*n; f%=mod; return f; } int main() { ll n; while(~scanf("%lld",&n)) { ll mx=-100; mt(a); mt(cnt); mt(num);
for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); num[a[i]]++; mx=max(mx,a[i]); } ll ans=0; for(ll i=mx;i>=2;i--) { int ret=num[i]; for(int j=i*2;j<=mx;j+=i) { cnt[i]
=(cnt[i]-cnt[j]+mod)%mod; ret+=num[j]; } // cout<<ret<<endl; cnt[i]+=get(ret);//想清楚。 cnt[i]+=mod; cnt[i]%=mod; ll p=i*(i-1)%mod; ans=(ans+(cnt[i]*p))%mod; } cout<<ans<<endl; } return 0; }

hdu 5212 反向容斥或者莫比