P2303 [SDOI2012] Problemas con Longge
Significado: preguntar
Arribista
∑ yo = 1 ngcd (i, n) ∑ re ∣ nd ∑ yo = 1 norte [mcd (i, n) = re] ∑ re ∣ nd ∑ i = 1 nd [mcd (i, nd) = 1] ∑ re ∣ nd ϕ (nd) \ sum_ {i = 1} ^ ngcd (i, n) \\ \ sum_ {d | n} d \ sum_ {i = 1} ^ n [gcd (i, n) = d] \ \ \ sum_ {d | n} d \ sum_ {i = 1} ^ {\ frac {n} {d}} [gcd (i, \ frac {n} {d}) = 1] \\ \ sum_ {d | n} d \ phi (\ frac {n} {d}) \\ i = 1∑ng c d ( yo ,n )d ∣ nΣrei = 1∑n[ g c d ( yo ,n )=d ]d ∣ nΣrei = 1∑ren[ g c d ( yo ,ren)=1 ]d ∣ nΣd ϕ (ren)
La primera fórmula: título.
La segunda fórmula: agregamos una enumeración, enumeramos el factor d de n (porque mcd (i, n) mcd (i, n)g c d ( yo ,n ) debe ser un factor de d) y luego contar[1, n] [1, n][ 1 ,n ] cuántosmcd (i, n) = d mcd (i, n) = dg c d ( yo ,n )=d , multiplicado por la contribución de esta d a la respuesta, cuente cada d nuevamente, es la respuesta.
La tercera fórmula: podemos entender que mcd (i, n) = d es equivalente a mcd (id, nd) = 1 mcd (i, n) = d, que es equivalente a gcd (\ frac id, \ frac nd) = 1g c d ( yo ,n )=D , y otros monovalentes a G C D (reyo,ren)=1 , es decir, podemos usar[1, n / d] [1, n / d][ 1 ,n / d ] enumeracióniii , determina cuántosmcd (i, nd) = 1 mcd (i, \ frac nd) = 1g c d ( yo ,ren)=1 es equivalente a en[1, n] [1, n][ 1 ,n ] Hojasiiyo juzgo cuántosmcd (i, n) = d mcd (i, n) = dg c d ( yo ,n )=d。
La cuarta fórmula: la definición de la función de Euler.
Código
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll phi(ll x) {
//根据欧拉函数的性质,求欧拉函数值
ll n = x, res = x;
if(x == 1 || x == 2) return 1;
for(ll i=2; i*i<=x; i++) {
if(n % i == 0) {
res = res/i*(i-1);
while(n % i == 0) n /= i;
}
}
if(n > 1) res -= res/n;
return res;
}
int main() {
ll n, ans = 0;
cin >> n;
for(ll i=1; i*i<=n; i++) {
//枚举n的每个因子
if(n % i == 0) {
ans += phi(i)*(n/i);
//如果i*i != n,i和n/i就不相等了,就可以都加起来,不然的话只能加一遍。
if(n/i != i) ans += phi(n/i)*i;
}
}
cout << ans;
return 0;
}