Uva10820 欧拉公式模板(求小于n且与n互素的数的个数)
题意:
给出n,算出小于等于n的所有数中,有几对互质;
解法:
本质就是求有多少个2元组(x,y)满足:1 <= x,y <= n,且x与y互素。
除了(1,1)之外,其他所有的x和y都不相同,我们设x<y的二元组有f(n)个,答案就是2f(n)+1 f(n)=phi(2)+phi(3)+...+phi(n);
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 const int maxn = 5e4 + 5; 5 int phi[maxn]; 6 7 //欧拉函数,求小于n且与n互素的整数个数 8 int euler_phi(int n) { 9 int m = (int)sqrt(n + 0.5); 10 int ans = n; 11 for (int i = 2; i <= m; i++) if (n%i == 0) { 12 ans = ans / i*(i - 1); 13 while (n%i == 0)n /= i; 14 } 15 if (n > 1)ans = ans / n*(n - 1); 16 return ans; 17 } 18 19 //求小于n的所有数的欧拉函数值 20 void phi_table(int n, int *phi) { 21 for (int i = 2; i <= n; i++)phi[i] = 0; 22 phi[1] = 1; 23 for (int i = 2; i <= n; i++)if (!phi[i]) 24 for (int j = i; j <= n; j += i) { 25 if (!phi[j])phi[j] = j; 26 phi[j] = phi[j] / i*(i - 1); 27 } 28 } 29 30 int main() { 31 int n; 32 while (scanf("%d", &n) && n) { 33 phi_table(n, phi); 34 int ans = 0; 35 for (int i = 2; i <= n; i++) ans += phi[i]; 36 printf("%d\n", ans + ans + 1); 37 } 38 return 0; 39 }