唯一分解定理

定义:

对于任何一个大于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)开始,表示测试用例的数量。

每种情况下,开始用含两个整数的行:一个 (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);
	}
 } 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值