Pairs Forming LCM LightOJ - 1236 (唯一分解定理的应用+线筛+MLE的情况)

传送门

题意:给一个数n(1<=n<=1e14),求满足lcm(i,j)==n&&1<=i<=n&&i<=j<=n的个数。多组输入,T<=200

题解:

所以可以将n唯一分解,然后找到每个p的最大质数mx(最多可以分解成多少个p)。然后每个质数贡献2*mx+1(不考虑j>=i这个条件,最后处理一下即可)。理解比如n=12中p=2的mx=3,它的组合可能为2 0,2,1,2 2,1 2,0 2。

比如12=2^2+3。那么总贡献为(2*2+1)*(2*1+1)=15,因为当i==j时,当且仅当i==j==n满足条件,所以答案为(总贡献/2+1) (与(总贡献+1)/2一样)。1的话特判为1。

AC代码:

ps:MLT还可能时N=1e7+10,long long vis[N]引起的

#include <bits/stdc++.h>
// #define int long long
#define ll long long
// #define read(x) scanf("%lld", &x)
// #define print(a, c) printf("%lld%c", a, c)
#define dbg(x) cout << #x << "===" << x << endl
#define pb push_back
using namespace std;
const int N = 1e7 + 10;
const int mod = 1e9 + 7;

ll n, ans;
int p[N], vis[N];  //这里long long的话会MLE
void init(int n) {
    int i, j;
    for (i = 2; i <= n; i++) {
        if (vis[i]) continue;
        p[++p[0]] = i;
        for (j = i + i; j <= n; j += i) vis[j] = 1;
    }
    // dbg(p[0]);
}
//时间复杂度O(200*sqrt(n))大概最多2e9,但是一般不会卡
ll count(ll x) {
    ll res = 1, i, j, a;
    for (i = 1; (ll)p[i] * p[i] <= x && i <= p[0]; i++) {
        a = 0;
        while (x % p[i] == 0) x /= p[i], a++;
        if (a > 0) res *= (2 * a + 1);  //主要操作
    }
    if (x > 1) res *= (2 * 1 + 1);
    // dbg(res);
    return res;
}
signed main() {
    int T;
    scanf("%d", &T);
    init(N - 2);
    for (int _ = 1; _ <= T; _++) {
        scanf("%lld", &n);
        ans = (count(n) + 1) / 2;
        printf("Case %d: %lld\n", _, ans);
    }
    return 0;
}
/*
input:::
15
2
3
4
6
8
10
12
15
18
20
21
24
25
27
29
output:::
Case 1: 2
Case 2: 2
Case 3: 3
Case 4: 5
Case 5: 4
Case 6: 5
Case 7: 8
Case 8: 5
Case 9: 8
Case 10: 8
Case 11: 5
Case 12: 11
Case 13: 3
Case 14: 4
Case 15: 2
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值