思路在代码里~~
#include <iostream>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define ll long long
using namespace std;
const int N=1e7+10;
bool vis[N];
int prime[1000000],tot;
void init()
{
tot=0;
int i,j;
for (i=2; i<N; i++)
vis[i]=true;
for (i=2; i<N; i++)
{
if (vis[i])
{
prime[tot++]=i;
for (j=i+i; j<N; j+=i)
vis[j]=false;//保证每个合数被它最小的质因数筛去
}
}
}
ll LCM(ll n)
{
ll i,j;
ll res=1;
for (i=0; prime[i]*prime[i]<=n&&i<tot; i++)
if (n%prime[i]==0)
{
int cnt=0;
while(n%prime[i]==0)
{
n/=prime[i];
cnt++;
}//pn^(an)
res=res*(2*cnt+1);
/*
要求lcm,有公式lcm(a,b)=p1^max(a1,b1)*p2^max(a2,b2)*p3^max(a3,b3)
而对n进行素因子分解:n=p1^(e1)*p2^(e2) *p3^(e3)*...*pk^(ek)
所以对于每个ai,都有取(ai>=bi)或不取(ai<bi),
当ai==ei时,bi可能取小于等于ai的所有数,取值[0,ei],有ei+1种情况。
当bi==ei时同理。
故对于每一个ei,都有2*(ei+1)种可能的取法。但是ai==bi==ei时会重复一个,所以
共2*ei+1个取法。
在2*ei+1个取法中满足a<=b的有(2*ei+1)/2+1个。
综上,我们只要求出n的所有质数的幂数ei,带入公式就可以了。
*/
}
if (n>1)
res=res*(2*1+1);
return res;
}
int main()
{
ll i,j,k,n,m;
int t,T;
init();
cin>>T;
for (t=1; t<=T; t++)
{
cin>>n;
printf("Case %d: %lld\n",t,(LCM(n)+1)/2);
}
return 0;
}