Pairs Forming LCM LightOJ - 1236

b = ∏ p 1 k e k b = \prod{p_{1k}^{e_k}} b=p1kek

b = ∏ p 2 k e k b = \prod{p_{2k}^{e_k}} b=p2kek

l c m = ∏ p 2 k m a x ( e k ) lcm = \prod{p_{2k}^{max(e_k)}} lcm=p2kmax(ek)

  1. 所以对于一个lcm一个数取ek次另一个有(1+ek)总取法 不妨将两种应为不知道两个数的大小所以不妨将两个数看成数对。所以ek对结果贡献为(2*ek+1) 去掉两个取一样的结果

  2. 总数要除于二

  3. (a,b) (b,a)均计算了两次但(N,N) 仅计算了一次

    #include<bits/stdc++.h>
    using namespace std;
    #define fst first
    #define sec second
    #define sci(num) scanf("%d",&num)
    #define scl(num) scanf("%lld",&num)
    #define mem(a,b) memset(a,b,sizeof a)
    #define cpy(a,b) memcopy(a,b,sizeof b)
    typedef long long LL;
    typedef pair<int,int> P;
    const int MAX_N = 1e7 + 100;
    const int MAX_M = 1e6;
    bool isp[MAX_N];
    int primes[MAX_M];
    void init() {
    for (int i =2 ;i < MAX_N;i++) {
    if (!isp[i]) {
    primes[++primes[0]] = i;
    for (int j = i + i;j < MAX_N;j+= i) {
    isp[j] = true;
    }
    }
    }
    }
    LL sum(LL N) {
    LL ans = 1;
    for (int i = 1;i <= primes[0] && N != 1 && N >= primes[i];i++) {
    int loc = 0;
    while (N % primes[i] == 0 && N != 1) {
    N /= primes[i];
    loc++;
    }
    ans = ans *( 2 * loc + 1);
    }
    if (N > 1) ans *= 3;
    ans = ans / 2 + 1;
    return ans;
    }
    int main() {
    init();
    int T;
    sci(T);
    for (int cs = 1;cs <= T;cs++) {
    LL N;
    scl(N);
    printf(“Case %d: %d\n”,cs,sum(N));
    }
    return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值