Pairs Forming LCM

题目大意:

给定 t 个数 n,对于每一个 n 求最大公倍数等于 n 的数对有多少个


一种全新的求解 gcdlcm 的方法:

a ,b 两个数进行质因数分解,得到:a=p1x1P2x2P3x3P4x4P5x5...Pn1xn1pnxn

b=p1y1P2y2P3y3P4y4P5y5...Pn1yn1pnyn

gcd(a,b)=p1min(x1,y1)p2min(x2,y2)p3min(x3,y3)...pnmin(xn,yn)

lcm(a,b)=p1max(x1,y1)p2max(x2,y2)p3max(x3,y3)...pnmax(xn,yn)

思路如下:

先对 n 素因子分解,得到,

n=p1e1P2e2P3e3P4e4P5e5...Pn1xn1pnxn

lcm(a,b)==n 时,max(x1,y1)==e1,max(x2,y2)==e2,max(xn,yn)==en
ai==ei 时,bi 可取 [0,ei] 中的所有数 ,有 ei+1 种情况,bi==ei 时同理。
那么就有 2(ei+1) 种取法,但是当 ai=bi=ei 时有重复,所以取法数为

2(ei+1)1=2ei+1

除了 (n,n) 所有的情况都出现了两次 那么满足 a<=b 的有 (2ei+1))/2+1

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1e7+5;
const int NN=1e6;
unsigned int prime[NN],cnt;           //prime[N]会MLE
bool vis[N];

void is_prime()
{
    cnt=0;
    memset(vis,0,sizeof(vis));
    for(int i=2;i<N;i++)
    {
        if(!vis[i])
        {
            prime[cnt++]=i;
            for(int j=i+i;j<N;j+=i)
            {
                vis[j]=1;
            }
        }
    }
}

int main()
{
    is_prime();
    int t;
    cin>>t;
    for(int kase=1;kase<=t;kase++)
    {
        LL n;
        cin>>n;
        int ans=1;
        for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++)
        {
            if(n%prime[i]==0)
            {
                int e=0;
                while(n%prime[i]==0)
                {
                    n/=prime[i];
                    e++;
                }
                ans*=(2*e+1);
            }
        }
        if(n>1)
            ans*=(2*1+1);
        printf("Case %d: %d\n",kase,(ans+1)/2);
    }
}
posted @   腾云今天首飞了吗  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示