求n以内与n互质的和 与n互质的平方和

结论: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());
	}
}

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/82556187