839D - Winter is here
839D - Winter is here
题意:
题解:
那个式子我都没想着去化简~太弱了=_=
参考的dalao的代码~
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=200010; 5 const int mod=1e9+7; 6 7 int cnt1[maxn*5],cnt2[maxn*5]; 8 ll dp[maxn*5]; 9 int base[maxn]; 10 11 int main(){ 12 base[0]=1; 13 for(int i=1;i<maxn;i++) base[i]=base[i-1]*2%mod; //预处理 14 int n; 15 scanf("%d",&n); 16 int x; 17 for(int i=0;i<n;i++){ 18 scanf("%d",&x); 19 cnt1[x]++; 20 } 21 for(int i=2;i<=1000000;i++){ 22 for(int j=i;j<=1000000;j+=i){ 23 cnt2[i]+=cnt1[j]; 24 } 25 } 26 for(int i=1000000;i>=2;i--){ 27 if(cnt2[i]==0) continue; 28 dp[i]=(1LL*base[cnt2[i]-1]*cnt2[i])%mod; 29 for(int j=i*2;j<=1000000;j+=i) dp[i]=(dp[i]+mod-dp[j])%mod; 30 } 31 int ans=0; 32 for(int i=2;i<=1000000;i++) ans=(ans+i*dp[i])%mod; 33 printf("%d\n",ans); 34 return 0; 35 }
下面这个更优一些(不完整
1 int N; 2 ll A[202020]; 3 ll mo=1000000007; 4 5 ll num[1010100]; 6 ll p[1010100]; 7 8 ll modpow(ll a, ll n = mo-2) { 9 ll r=1; 10 while(n) r=r*((n%2)?a:1)%mo,a=a*a%mo,n>>=1; 11 return r; 12 } 13 14 void solve() { 15 int i,j,k,l,r,x,y; string s; 16 17 cin>>N; 18 FOR(i,N) { 19 cin>>A[i]; 20 for(x=1;x*x<=A[i];x++) if(A[i]%x==0) { 21 num[x]++; 22 if(x*x!=A[i]) num[A[i]/x]++; 23 } 24 } 25 26 ll tot=0; 27 for(i=1000000;i>=2;i--) { 28 if(num[i]) { 29 p[i]=num[i]*modpow(2,num[i]-1)%mo; 30 for(j=i*2;j<=1000000;j+=i) p[i]-=p[j]; 31 p[i]=(p[i]%mo+mo)%mo; 32 33 (tot+=p[i]*i)%=mo; 34 } 35 } 36 cout<<tot<<endl; 37 }
另一种解法,还没仔细看~