原题:http://acm.hdu.edu.cn/showproblem.php?pid=3501
题解:求比n小且不互质的数的和。可以先求互质数的和即:
证明如下:
有:
即质数总是成对存在的且相加为n共有个,所以和为
。
答案为:
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int M=1e9+7;
int n;
int phi(int x){
int ans=x;
for(int i=2;1ll*i*i<=1ll*x;i++){
if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0)x/=i;
}
}
if(x>1) ans=ans/x*(x-1);
return ans;
}
int main(){
// freopen("hdu3501.in","r",stdin);
while(1){
scanf("%d",&n);
if(n==0)break;
int ans=(1ll*n*(n-1)/2-(1ll*n*(phi(n))/2))%M;
printf("%d\n",ans);
}
return 0;
}