定义:
对于任何一个大于1的正整数,都存在一个标准的分解式:
N=p1^a1 * p2^a2···pn^an;
唯一分解定理及算术基本定理表明
任何一个大于 1的正整数都可以表示为素数的积
设F(n)代表n的正因子的数量,
则F(n)=(a1+1)*(a2+1)*(a3+1)*······*(an+1)
设G(n)代表n的正因子的和,
则G(n)=(1+p1^2+p1^3+...+p1^a1)*(1+p2^2+p2^3+...p2^a2)*....*(1+pn^1+pn^2+...+pn^an);
伪代码:
//求一个数的正因子数
for(i=0;i<cot&&prime[i]*prime[i]<=temp;i++)
{
cnt=0;
while(temp%prime[i]==0)
{
temp/=prime[i];
cnt++;
}
num*=(cnt+1);
}
if(temp>1) num*=2;
例题:A - Aladdin and the Flying Carpet
据说阿拉丁在获得魔法之光之前必须解开七个谜团才能召唤出一个强大的精灵。在这里,我们关注第一个谜。
阿拉丁即将进入一个神奇的洞穴,由邪恶的巫师领导,他伪装成阿拉丁的叔叔,在入口处发现了一个奇怪的神奇飞毯。有一些奇怪的生物守卫着洞穴的入口。阿拉丁可以跑,但他知道有很高的机会被抓住。所以,他决定使用神奇的飞毯。地毯呈矩形,但不是方形。阿拉丁拿走了地毯,在他的帮助下,他经过了入口。
现在,您将获得地毯的区域和地毯最小可能的长度,您的任务是找到可能的地毯类型。例如,地毯12的面积和地毯的最小可能侧面是2,那么可以有两种类型的地毯,它们的侧面是:{2,6}和{3,4}。
输入
输入以整数T(≤4000)开始,表示测试用例的数量。
每种情况下,开始用含两个整数的行:一个 b (1≤b≤一个≤10 12),其中一个表示地毯的面积和b表示地毯的最小可能侧。
产量
对于每种情况,请打印案例编号和可能的地毯数量
Sample Input
2
10 2
12 2
Sample Output
Case 1: 1
Case 2: 2
已AC代码
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
const ll INF=1e6+7;
int vis[INF]={0};
int prime[INF];
ll cot=0;
void make_prime()
{
for(ll i=2;i<=INF;i++)
{
if(vis[i]==0)
prime[cot++]=i;
for(ll j=0;j<cot&& i*prime[j]<=INF; j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
cot=0;
make_prime();
ll t,p;
ll ans=0,cnt=0;
scanf("%lld",&t);
for(p=1;p<=t;p++)
{
ll a,b,i,num=1,cnt=0;
scanf("%lld%lld",&a,&b);
if(a<=b*b)
{
printf("Case %lld: 0\n",p);
continue;
}
ll temp=a;
for(i=0;i<cot&&prime[i]*prime[i]<=temp;i++)
{
cnt=0;
while(temp%prime[i]==0)
{
temp/=prime[i];
cnt++;
}
num*=(cnt+1);
}
if(temp>1)
num*=2; //依题目不同而改变
num/=2; //依题目不同而改变
for(i=1;i<b;i++)
{
if(a%i==0)
num--;
}
printf("Case %lld: %lld\n",p,num);
}
}