来源:HDU1215
一套kuangbin模板。题意简单,分析就好
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int g,l;
const int MAXN = 1000000+10;
int prime[MAXN];
void ini(){
memset(prime,0,sizeof(prime));
for(int i=2;i<MAXN;i++){
if(!prime[i])
prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){
prime[prime[j]*i]=i;
if(i%prime[j]==0) break;
}
}
}
long long fac[MAXN][2];
//int faccnt;
int getfac(long long x){
int faccnt=0;
long long tmp=x;
for(int i=1;prime[i]<=tmp/prime[i];i++){
fac[faccnt][1]=0;
//cout<<"tmp: "<<tmp<<" "<<faccnt<<endl;
if(tmp%prime[i]==0){
fac[faccnt][0]=prime[i];
while(tmp%prime[i]==0) {
fac[faccnt][1]++;
tmp/=prime[i];
}
//cout<<"qingkuang: "<<fac[faccnt][0]<<" "<<fac[faccnt][1]<<endl;
faccnt++;
}
}
//cout<<"qingkuang: "<<tmp<<" "<<faccnt<<endl;
if(tmp!=1){
fac[faccnt][0]=tmp;
fac[faccnt++][1]=1;
}
return faccnt;
}
int main(){
int T;
scanf("%d",&T);
ini();
while(T--){
scanf("%d%d",&g,&l);
if(l%g) {
puts("0");
continue;
}
int temp=l/g;
int du=getfac(temp);
int ans=1;
for(int i=0;i<du;i++){
//cout<<fac[i][0]<<" "<<fac[i][1]<<endl;
ans*=(6*fac[i][1]);
}
cout<<ans<<endl;
}
return 0;
}
本文介绍了一个用于解决质因数分解和基于分解结果进行组合计数问题的kuangbin模板。通过预处理得到所有小于等于100万的质数,并实现了高效的质因数分解算法。此算法可以快速获取任意整数的所有质因数及其指数,并以此为基础计算特定组合的数量。
756

被折叠的 条评论
为什么被折叠?



