LightOJ - 1341 Aladdin and the Flying Carpet 唯一分解定理LightOJ 1220Mysterious Bacteria
作者:互联网
题意:
t 组数据,第一个给定飞毯的面积为 s,第二个是毯子的最短的边的长度大于等于这个数,毯子是矩形但不是正方形。
思路:
求出 s 的所有因子,因为不可能是矩形,所以可以除以 2,最后暴力求出最短边长以内的因子,相减得出答案。
想要求出s以内的因子数量,就用到了唯一分解定理,先求素数
唯一分解定理:
任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1 P2a2 P3a3 … Pnan,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式
(1)一个大于1的正整数N,如果它的标准分解式为:N=P1a1 P2a2 P3a3 … Pnan ,那么它的正因数个数为 sum=(1+a1)(1+a2)(1+a3)…(1+an)。
(2) 它的全体正因数之和为 (1+p11+p12+…+p1a1)(1+p21+p22+…+p2a2)…(1pn1+pn2+…+pnan)。
LightOJ1220: x=bp,求出最大的 p 可以是几?(LightOJ 1220 Mysterious Bacteria)
即求出 x的标准分解式中的所有a的最大公约数。
//LightOJ - 1341
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
int main()
{
int t,z=1;
bool book[1000910]= {0};
long long s,l;
vector<int>v;
for(int i=2; i<=1000010; i++)
if(!book[i])
for(int j=i*2; j<=1000010; j=j+i)
book[j]=1;
for(int i=2; i<=1000008; i++)
if(!book[i])
v.push_back(i);
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&s,&l);
if(l>=sqrt(s))
{
printf("Case %d: 0\n",z++);
continue;
}
long long sum=0;
for(long long i=1; i<l; i++)
if(s%i==0)
sum++;
long long i=0,ans=1;
while(i<v.size()&&v[i]<s)//素数小于 s
{
int tt=0;
while(s%v[i]==0)
{
tt++;
s=s/v[i];
}
ans=ans*(1+tt);//(1+a1)*(1+a2)*(1+a3)*.....*(1+an) //因子的数量
i++;
}
if(s>1)//若s>1,则为素数
ans=ans*2;
ans=ans/2;//几对素数
printf("Case %d: %lld\n",z++,ans-sum);
}
return 0;
}
//LightOJ 1220
#include<string.h>
#include<vector>
#include<stdio.h>
using namespace std;
int gcd(int a,int b)//求最大公约数
{
return a%b==0?b:gcd(b,a%b);//辗转相除法
}
int main()
{
vector<int>v;
bool book[1010000];
memset(book,0,sizeof(book));
book[1]=1;
for(int i=2; i<=1000100; i++)//素数筛
if(!book[i])
{
v.push_back(i);//储存素数
for(int j=i*2; j<=1000100; j=j+i)
book[j]=1;
}
int t,z=1,flag=0;
long long n;
scanf("%d",&t);
while(t--)
{
flag=0;
scanf("%lld",&n);
if(n<0)
{
n=n*-1;
flag=1;
}
int ans=0;
for(int i=0; i<v.size()&&v[i]*v[i]<=n; i++)
{
if(n%v[i]==0)
{
int tt=0;
while(n%v[i]==0)
{
n=n/v[i];
tt++;
}
if(ans==0)//第一次求最大公约数
ans=tt;
else
ans=gcd(ans,tt);// x=b^p p=gcd(a1,a2,a3...,an)
}
}
if(n > 1)//存在n>1时 指数的最大公约数为1 n此时为素数
ans = gcd(ans, 1);
if(flag == 1)
{
while(ans % 2 == 0)
ans >>= 1;
}
printf("Case %d: %d\n",z++,ans);
}
return 0;
}
标签:Aladdin,int,LightOJ,long,1220Mysterious,ans,include,book 来源: https://blog.csdn.net/DREAM_yao/article/details/99047879