题目
求出n的偏序关系下的哈斯图的边数
求
出
n
的
偏
序
关
系
下
的
哈
斯
图
的
边
数
如图
n=60
n
=
60
题解
考虑对n质因子分解
考
虑
对
n
质
因
子
分
解
分解为m个质数因子每个因子有ci个
分
解
为
m
个
质
数
因
子
每
个
因
子
有
c
i
个
对于每一质数因子
i
i
会被相关联条边
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000000;
ll prime[maxn];
ll factor[100000][2];int facnt;
void getPrime() {
memset(prime,0,sizeof(prime));
for(ll i=2;i<maxn;i++) {
if(!prime[i]) prime[++prime[0]] = i;
for(ll j=1;j<=prime[0]&&prime[j]*i<maxn;j++) {
prime[prime[j]*i] = 1;
if(i % prime[j] == 0) break;
}
}
}
void getFactor(ll p) {
facnt = 0;
ll tmp = p;
for(ll i=1;prime[i]*prime[i]<=tmp;i++) {
factor[facnt][1] = 0;
if(tmp % prime[i] == 0) {
factor[facnt][0] = prime[i];
while(tmp % prime[i] == 0) {
factor[facnt][1]++;
tmp /= prime[i];
}
facnt++;
}
}
if(tmp != 1) {
factor[facnt][0] = tmp;
factor[facnt++][1] = 1;
}
}
ll n;
int main()
{
getPrime();
int caset;scanf("%d",&caset);
while(caset--) {
scanf("%lld",&n);
getFactor(n);
ll ans = 0;
for(int i=0;i<facnt;i++) {
ll tmp = 1;
for(int j=0;j<facnt;j++) if(i!=j){
tmp *= (factor[j][1] + 1);
}
ans += tmp * factor[i][1];
}
printf("%lld\n",ans);
}
return 0;
}