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;
    }
    
  • 相关阅读:
    使用Eclipse 创建Spring Boot项目
    springMVC中文乱码问题
    Java POI Excel 导入导出
    springMVC + quartz实现定时器(任务调度器)
    spring配置Converter、Formatter日期转换器
    springMVC+springJDBC+Msql注解模式
    基于JavaScript封装的Ajax工具类
    H5音乐播放器
    JavaWeb+MySql分页封装
    JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11846361.html
Copyright © 2011-2022 走看看