LightOJ 1236 - Pairs Forming LCM(素因子分解)

Posted Ritchie丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1236 - Pairs Forming LCM(素因子分解)相关的知识,希望对你有一定的参考价值。

题意 给你一个数n 求满足lcm(a, b) == n, a <= b 的 (a,b) 的个数

容易知道 n 是a, b的所有素因子取在a, b中较大指数的积

先将n分解为素数指数积的形式 n = π(pi^ei) 那么对于每个素因子pi pi在a,b中的指数ai, bi 至少有一个等于pi, 另一个小于等于pi

先不考虑a, b的大小 对于每个素因子pi

1. 在a中的指数 ai == ei 那么 pi 在 b 中的指数可取 [0, ei] 中的所有数 有 ei + 1 种情况

2. 在a中的指数 ai < ei 即 ai 在 [0, ei) 中 那么 pi 在 b 中的指数只能取 ei 有 ei 种情况

那么对与每个素因子都有 2*ei + 1种情况 也就是满足条件的 (a, b) 有π(2*ei + 1)个 考虑大小时除了 (n, n) 所有的情况都出现了两次 那么满足a<=b的有(π(2*ei + 1)) / 2 + 1

#include <iostream>  
#include <stdio.h>  
typedef long long LL;  
using namespace std;;  
const int N=1e7+5;  
int p[N/10],k,i,j;  
bool flag[N];//默认是false  
void sushu()  
{  
    k=0;  
    for(i=2;i<N;i++)  
    {  
        if(!flag[i])  
        {  
            p[k++]=i;  
            for(j=i;j<N;j=j+i) //j=i 不是j=2  
            flag[j]=true;  
        }  
    }  
}  
int main()  
{  
    sushu();  
    int t,cas=0;  
    LL n,ans,c;  
    cin>>t;  
    while(t--)  
    {  
        cin>>n;  
        ans=1;  
        for(i=0;i<k;i++)  
        {  
            if(LL(p[i])*p[i]>n)  
            break;  
            c=0;  
            while(n%p[i]==0)  
            {  
                n/=p[i];  
                c++;  
            }  
            if(c) ans*=2*c+1;  
        }  
        if(n>1) ans*=3;  
        printf("Case %d: %lld\n",++cas,ans/2+1); //大写的C  
    }  
    return 0;  
}

 

以上是关于LightOJ 1236 - Pairs Forming LCM(素因子分解)的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ 1236 Pairs Forming LCM(算数基本定理)

1236 - Pairs Forming LCM -- LightOj1236 (LCM) 给你一个数n,让你求1到n之间的数(a,b && a<=b)两个数的最小公倍数等

1236 - Pairs Forming LCM

lightoj 1236 唯一分解定理

mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

MySQL 5.5 '二进制日志未打开',错误代码:1236