zoukankan      html  css  js  c++  java
  • LightOJ

    链接:

    https://vjudge.net/problem/LightOJ-1236

    题意:

    Find the result of the following code:

    long long pairsFormLCM( int n ) {
    long long res = 0;
    for( int i = 1; i <= n; i++ )
    for( int j = i; j <= n; j++ )
    if( lcm(i, j) == n ) res++; // lcm means least common multiple
    return res;
    }

    A straight forward implementation of the code may time out. If you analyze the code, you will find that the code actually counts the number of pairs (i, j) for which lcm(i, j) = n and (i ≤ j).

    思路:

    考虑lcm(a, b)= n,有(a = p_1^{k1}*p_2^{k2}*p_3^{k3}, b = p_1^{t1}*p_2^{t2}, n = p_1^{e1}*p_2^{e2}).
    如果想lcm(a, b) = n,得保证对于每个p,max(ki, ti) = ei.保证每个素数满足n的指数。
    这样每个p有(2*ei+1)种取值,减去相同。
    则得到了无序对(a, b)
    有序对则加1除2,因为相同的只计算了一次。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<math.h>
    #include<vector>
    #include<map>
    
    using namespace std;
    typedef long long LL;
    const int INF = 1e9;
    
    const int MAXN = 1e7+10;
    const int MOD = 1e9+7;
    
    bool IsPrime[MAXN];
    int Prime[1000010];
    int tot;
    LL n;
    
    void Init()
    {
        tot = 0;
        memset(IsPrime, 0, sizeof(IsPrime));
        IsPrime[1] = 1;
        for (int i = 2;i < MAXN;i++)
        {
            if (IsPrime[i] == 0)
                Prime[++tot] = i;
            for (int j = 1;j <= tot && i*Prime[j] < MAXN;j++)
            {
                IsPrime[i*Prime[j]] = 1;
                if (i%Prime[j] == 0)
                    break;
            }
        }
    }
    
    int main()
    {
        Init();
        int t, cnt = 0;
        scanf("%d", &t);
        while(t--)
        {
            printf("Case %d:", ++cnt);
            scanf("%lld", &n);
            LL x = n;
            LL sum = 1;
            for (int i = 1;i <= tot && Prime[i] <= x;i++)
            {
                if (x%Prime[i] == 0)
                {
                    int cnt = 0;
                    while(x%Prime[i] == 0)
                    {
                        cnt++;
                        x /= Prime[i];
                    }
                    sum *= (2LL*cnt+1);
                }
            }
            if (x>1)
                sum *= 3LL;
            sum = (sum+1)/2;
            printf(" %lld
    ", sum); 
        }
        
        return 0;
    }
    
  • 相关阅读:
    Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决
    delphi中URL的汉字编码
    python手记(11)
    李维对VCL理解的几个错误
    如何配置MYSQL的MASTER---SLAVE复制备份?
    UniDAC连接Embedded MySQL server
    unigui组件中client javascript delphi组件之间的操作
    Delphi中SendMessage使用说明(所有消息说明) good
    iOS面试题
    Windows的MAX_PATH
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11846361.html
Copyright © 2011-2022 走看看