• SOJ 4467 easyproblem 2【欧拉函数 最大公因数和】


    这题wa的莫名其妙,郁闷了一下午,队友暴力一发跟我答案也是一样。后来队友说试试把%I64d换成%lld,果然一下ac。。。(暴露了在soj做题少。。
    ac之后排在ranklist的最后一名。。。目前也想不到什么优化了。。
    还有就是以后对于longlong直接就用cout和cin。。
    或者像璟璟说的,热身赛的时候测试一下。。。

    题目链接:

    http://acm.scu.edu.cn/soj/problem.action?id=4467

    题意:

    给定n,计算gcd(i,n)(inn<109)

    分析:

    想明白一点
    如果dn的一个约数,那么1ingcd(i,n)=d的个数是φ(n/d)
    (φ(Nd)代表的是从1到n中与n最大公约数为d的个数)
    然后求出因数搞一搞~

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e6 + 10;
    int flag[maxn], prime[maxn];
    int tot = 0;
    void getprime()
    {
        fill(flag, flag + maxn, 1);
        for(int i = 2; i < maxn; i++){
            if(flag[i]){
                prime[tot++] = i;
                for(int j = 2 * i; j < maxn; j += i){
                    flag[j] = 0;
                }
            }
        }
    }
    ll euler(int n)
    {
        ll ans = n;
        for(int i = 0; i < tot && prime[i] * prime[i] <= n; i++){
            if(n % prime[i] == 0){
                ans = ans / prime[i] * (prime[i] - 1);
                while(n % prime[i] == 0) n /= prime[i];
            }
        }
        if(n != 1) ans = ans / n * (n - 1);
        return ans;
    }
    int main (void)
    {
        int n;
        getprime();
        while(~scanf("%d", &n)){
            ll ans = 0;
             for(int i = 1; i <= sqrt(n); i++){
                if(n % i == 0){
                    ans += euler(n / i) * i;
                    if(n / i != i)  ans += euler(i) * (n / i);
                }
             }
             printf("%lld
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    【原创】用python写的一个监测本地进程CPU占用的程序
    CSS清除浮动的7种方法以及优缺点
    JavaScript函数作用域
    BOM的概念以及相关操作
    文件与文件系统的压缩与打包
    CSRF
    netstat 命令详解
    httpd安装
    ubuntu 耳机没声音
    Linu正常使用MobaXterm
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758669.html
Copyright © 2020-2023  润新知