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 }
ac

下面这个更优一些(不完整

 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 }
View Code

 

 

另一种解法,还没仔细看~

 

posted @ 2017-08-15 10:48  yijiull  阅读(169)  评论(0编辑  收藏  举报