H - Pairs Forming LCM
GCD&&LCM
a=p1 ^ a1 * p2 ^ a2 *…*pn ^ an
b=p1 ^ b1 * p2 ^ b2 *…*pn ^ bn
gcd(a,b)=p1 ^ min(a1,b1) * p2 ^ min(a2,b2) *…*pn ^ min(an,bn)
lcm(a,b)=p1 ^ max(a1,b1) * p2 ^ max(a2,b2) *…*pn ^ max(an,bn)
lcm(a,b)=c.
c=p1 ^ c1 * p2 ^ c2 *…*pn ^ cn
a=p1 ^ a1 * p2 ^ a2 *…*pn ^ an
b=p1 ^ b1 * p2 ^ b2 *…*pn ^ bn
对于p1这个质因子来讲:a1=c1,b1=c1,应有一个成立.
当a1=c1时,b1可取(0,c1)任意值。有(c1+1)种情况。
同理当b1=c1时,a1可取(0,c1)任意值。有(c1+1)种情况。
两种情况都包含a1=c1&&b1=c1,b1=c1&&a1=c1这总情况。
对于每个质因子有2* c1+1种情况。
故总共有 (2*c1+1) * (2 *c2+1) * … *(2 *cn+1).对数。但是a<b.
这里面会有a=b的这一对情况不合理。除了这一对的没对对称存在应/2.因为(a<b)
#include<cstdio>
#include<iostream>
#include<cmath>
#define en '\n'
using namespace std;
typedef long long ll;
const int N=1e6;
int prime[N],tot;
bool is[N*10+5];
void getprime()
{
tot=0;
for(int i=2;i<=N*10;++i)
{
if(!is[i]) prime[++tot]=i;
for(int j=1;j<=tot;++j)
{
if((ll)i*prime[j]>N*10) break;
is[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
ll solve(ll n)//采用素数分解质因子 时间复杂度降低
{
ll ans=1;
for(ll i=1;prime[i]*prime[i]<=n&&i<=tot;++i)
{
int num=0;
while(n%prime[i]==0) ++num,n/=prime[i];
if(num) ans*=2*(num+1)-1;
}
if(n>1) ans*=2*(1+1)-1;
return ans;
}
int main()
{
getprime();
int T,cas=0;scanf("%d",&T);
while(T--)
{
ll n;scanf("%lld",&n);
ll ans=solve(n);
printf("Case %d: %lld\n",++cas,(ans-1)/2+1);
}
}