BIT1057 Sum

题意:

给一个n,求

少于或等于n的数中与n不互质的数的和

我们先求

少于或等于n的数中与n互质的数的和

对于i与n互素

gcd(n,i)=1

必有gcd(n,n-i)=1

设n的欧拉函数值为f[n]

则有f[n]个数与n互素,这些数两两相加必等于n

于是有答案为f[n]*n/2

#include<iostream>
#include<algorithm>
#include<cstdio>
#define MOD 1000000007
using namespace std;
long long euler(long long n)//求n的欧拉函数  
{  
	long long ans=1,i;  
	for(i=2;i*i<=n;i++)  
		if (n%i==0)  
		{  
			ans*=i-1; n/=i;  
			while(n%i==0)  
			{ 
				ans*=i; 
				n/=i; 
			}  
		}  
		if (n>1) 
		{
			ans*=n-1;  
		}
		return ans;  
}
int main()
{
	long long n;
	while(scanf("%lld",&n),n)
	{
		if(n==2)
		{
			printf("0\n");
			continue;
		}
		long long ans=n*(euler(n)/2);
		ans=ans%MOD;
		ans=n*(n+1)/2-ans-n;
		ans=ans%MOD;
		printf("%lld\n",ans);
	}
	return 0;
}


你可能感兴趣的:(BIT1057 Sum)