• 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
    ", ans + ans + 1);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    新机自动创建yum库
    一段自动添加证书命令
    一段托盘程序
    date
    1234567890 转换成 1,234,567,890
    删除localStorage数组中其中一个元素(根据元素中的属性key)
    xcode6 ios launchimage
    画分割线
    裁剪和打水印
    UITextView添加一个placeholder功能
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9499461.html
Copyright © 2020-2023  润新知