设n = a1^p1*a2^p2*a3^p3*......*an^pn.(a1,a2,..an为质因子)
若a,b的最小公倍数为n,则a,b中一定含有因子a1^p1||a2^p2||a3^p3||....an^pn,否则最小公倍数一定小于n
如果假设a含有因子a1^p1,对于b的a1项可以取(a1^0,a1^1,....,a1^p1),反之,若b含有因子a1^p1,a中a1项可取(a1^0,a1^1,....,a1^p1),即对于序列队a,b中的a1项的取法共有(p1+1)*2-1种,同理可得a2,a3,....,an项的取法
所以序列对的总数为(2*p1+1)*(2*p2+1)*.....*(2*pn+1)
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int prime[5000000];
bool a[10000000];
int count;
void makePrime()
{
for(int i = 2;i<10000000;i++)
{
if(a[i]==0)
{
if(i<=sqrt(10000000))
{
for(int j = i*i;j<10000000;j+=i)
{
a[j] = 1;
}
}
prime[count++] = i;
}
}
}
int main()
{
makePrime();
int T;
scanf("%d",&T);
long long m;
long long ans;
for(int i = 1;i<=T;i++)
{
scanf("%lld",&m);
int k;
ans = 1;
for(int j = 0;j<count&&prime[j]*prime[j]<=m;j++)
{
k = 0;
while(m%prime[j]==0)
{
k++;
m /= prime[j];
}
ans *= ((k+1)*2-1);
}
if(m>1)
ans *= 3;
printf("Case %d: %lld\n",i,(ans+1)/2);
}
return 0;
}