1. 程式人生 > >hdu 5212 Code 篩法或者莫比烏斯

hdu 5212 Code 篩法或者莫比烏斯

ott eat for php -- ++ inpu for each first

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 BestCoder Round #39 ($)

先占坑,晚點補莫比烏斯

#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;
}

hdu 5212 Code 篩法或者莫比烏斯