题目链接
题目大意
题意。。emmmm还是读题吧,大概就是看数有多少个线
解题思路
看图可以看出来,和每个数相连的线的个数是他的素因子的个数
所以我们把素因子的个数筛出来,然后,列出所有的组合方式的个数,就是答案了
(2,3)和(3,2)算两种,因为6有两条线
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1048586;
long long pre[100005],num,cnt;
int ins[1100005];
int p[100005],e[100005];
long long c[45][45];
void init()
{
for(int i=2; i<=N; i++)
{
if(!ins[i])
pre[num++]=i;
for(int j=0; j<num&&i*pre[j]<=N; j++)
{
ins[i*pre[j]]=1;
if(!(i%pre[j]))
break;
}
}
}
long long C()
{
for(int i=1; i<=40; i++)
c[i][i]=1,c[i][0]=1;
for(int i=1; i<=40; i++)
for(int j=1; j<i; j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
void F(long long x)
{
cnt=0;
for(int i=0; i<num; i++)
{
if(x%pre[i]==0)
{
p[++cnt]=pre[i];
while(x%pre[i]==0)
{
x/=pre[i];
e[cnt]++;
}
}
}
if(x>1)
{
p[++cnt]=x;
e[cnt]=1;
}
}
int main()
{
init();
C();
long long n;
int T;
scanf("%d",&T);
while(T--)
{
memset(e,0,sizeof(e));
scanf("%lld",&n);
F(n);
// for(int i=1; i<cnt; i++)
// printf("*%d %d\n",p[i],e[i]);
long long ans=0;
for(int i=0;i<=cnt;i++)
{
long long res=e[i];
for(int j=0;j<=cnt;j++)
{
if(i!=j)
res*=(e[j]+1);
}
ans+=res;
}
printf("%lld\n",ans);
}
return 0;
}