结论:gcd(n,m)=1,那么gcd(n,n-m)=1;
求和的时候 ph(n)即可 sum = ph(n)*n/2;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll euler(ll n)
{
ll ans = n;
for(int i = 2; i * i <= n; i++)
if(n % i == 0)
{
ans = ans / i * (i-1);
while(n % i == 0)
n /= i;
}
if(n > 1)
ans = ans / n * (n-1);
return ans;
}
int main ()
{
ll n;
while(scanf("%lld",&n),n)
{
printf("%lld\n",euler(n) * n / 2);
}
}
求互质平方和 要用到容斥+数学基本定理
我们把素数因子状压,奇数个 加上,偶数个 减去
另外数学结论:例如 n=10,素数因子2 2影响的为 2 4 6 8 10 2^2(1^2+2^2+3^2+4^2+5^2)
n^2 前n项和 n*(n+1)*(2*n+1)/6
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int prime[N], len;
ll n;
void euler()
{
len = 0;
ll ans = n;
for(int i = 2; i * i <= ans; i++)
if(n % i == 0)
{
prime[len++] = i;
while(ans % i == 0)
ans /= i;
}
if(ans > 1){
prime[len++] = ans;
}
}
ll cul(ll x){
return x * (x + 1) * (x * 2 + 1) / 6;
}
ll solve(){
ll ans = 0;
for(int i = 1; i < (1 << len); i++){
ll res = 1, cnt = 0;
for(int j = 0; j < len; j++){
if(i & (1 << j)){
cnt++;
res *= prime[j];
}
}
if(cnt & 1) ans += res * res * cul(n / res);
else ans -= res * res * cul(n / res);
}
return ans;
}
int main ()
{
while(~scanf("%lld",&n)){
if(!n || n == 1){
printf("0\n");
continue;
}
euler();
printf("%lld\n",cul(n) - solve());
}
}