}
题意:
就是求1~n之间,两两最小公倍数等于n的个数。
思路:
设lcm(A,B)=M
设分解质因数之后:
A=x^a1+y^a2+z^a3+......
B=x^b1+y^b2+z^b3+......
M=x^c1+y^c2+z^c3+......
因为M是A和B的最小公倍数,所以对每个质因数都会有max(ai ,bi)=ci
比如设ci=2,那么就有以下几种情况:
ai=2 , bi=2 ai=2 , bi=1 ai=2 , bi=0
ai=1 , bi=2 ai=0 , bi=2
所以对于每个ci,所能创造的数量就是2*ci-1,全部乘起来就是总数了。
代码:
#include"cstdio"
#include"cstring"
#include"cmath"
#include"cstdlib"
#include"algorithm"
#include"iostream"
#include"map"
#include"queue"
#define ll long long
using namespace std;
#define MAXN 10000007
bool mark[MAXN];
int ss[MAXN/10],sscnt;
void ssb()
{
sscnt=0;
memset(mark,false,sizeof(mark));
mark[0]=mark[1]=true;
for(int i=2; i<=MAXN; i++)
{
if(!mark[i])
{
for(int j=i+i; j<=MAXN; j+=i) mark[j]=true;
ss[sscnt++]=i;
}
}
return ;
}
int main()
{
int t,cas=1;
cin>>t;
ssb();
while(t--)
{
ll n;
ll ans=1;
scanf("%lld",&n);
for(int i=0;i<sscnt;i++)
{
if((ll)ss[i]*ss[i]>n) break;
if(n%ss[i]==0)
{
int tep=0;
while(n%ss[i]==0)
{
tep++;
n/=ss[i];
}
ans*=2*tep+1;
}
}
if(n!=1) ans*=3;
printf("Case %d: %lld\n",cas++,(ans+1)/2);
}
return 0;
}[lcm本质] light oj 1236 Pairs Forming LCM
原文:http://blog.csdn.net/wdcjdtc/article/details/44653803