hdu 5212 Code 筛法或者莫比乌斯

Code

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)



Problem Description
WLD likes playing with codes.One day he is writing a function.Howerver,his computer breaks down because the function is too powerful.He is very sad.Can you help him?

The function:


int calc
{
  
  int res=0;
  
  for(int i=1;i<=n;i++)
    
    for(int j=1;j<=n;j++)
    
    {
      
      res+=gcd(a[i],a[j])*(gcd(a[i],a[j])-1);
      
      res%=10007;
    
    }
  
  return res;

}
 

 

Input
There are Multiple Cases.(At MOST 10)

For each case:

The first line contains an integer N(1N10000).

The next line contains N integers a1,a2,...,aN(1ai10000).
 

 

Output
For each case:

Print an integer,denoting what the function returns.
 

 

Sample Input
5 1 3 4 2 4
 

 

Sample Output
64
Hint
gcd(x,y) means the greatest common divisor of x and y.
 

 

Source

先占坑,晚点补莫比乌斯

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define eps 1e-8
#define bug(x)  cout<<"bug"<<x<<endl;
const int N=1e4+10,M=1e6+10,inf=1e9+10;
const LL INF=1e18+10,mod=1e9+7;

int cnt[N],sum[N];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(cnt,0,sizeof(cnt));
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            cnt[x]++;
        }
        for(int i=1;i<=10000;i++)
        {
            for(int j=i;j<=10000;j+=i)
                sum[i]+=cnt[j];
            sum[i]=sum[i]*sum[i];
        }
        LL ans=0;
        for(int i=10000;i>=1;i--)
        {
            for(int j=i+i;j<=10000;j+=i)
                sum[i]-=sum[j];
            //if(sum[i])cout<<i<<" "<<sum[i]<<endl;
            ans+=1LL*i*(i-1)*sum[i];
            ans%=10007;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

posted @ 2017-09-08 20:23  jhz033  阅读(165)  评论(0编辑  收藏  举报