码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-19 20:59:18      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

题意 给你一个数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(素因子分解)

标签:

原文地址:http://www.cnblogs.com/Ritchie/p/5296122.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!