您的位置:首页 > 其它

1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)

2016-05-25 21:04 609 查看
http://lightoj.com/volume_showproblem.php?problem=1341

题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数。

什么叫唯一分解定理:算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1P2a2P3a3......Pnan,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式



我们求出n的因子个数之后,先除以2,得到一半的因子个数,然后从头开始循环到b不合格的直接减去

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include <queue>

using namespace std;
#define N 1001000
#define ESP 1e-8
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

int prime
, k, vis
;

void Prime()
{
k=0;
memset(vis, 0);
for(int i=2; i<N; i++)
{
if(!vis[i])
{
prime[k++] = i;
for(int j=i+i; j<N; j+=i)
vis[j] = 1;
}
}
}///素数筛选

long long solve(long long n)
{
long long int sum = 1;

for(int i=0; i<k && prime[i]*prime[i]<=n; i++)
{
if(n%prime[i] == 0)
{
int ans=0;
while(n%prime[i] == 0)
{
ans++;
n /= prime[i];
}
sum *= (1+ans);
}
}

if(n>1)
sum *= 2;
return sum;
}///求n得因子个数;

int main()
{
int T, t=1;
scanf("%d", &T);
Prime();
while(T --)
{
long long a,b;
scanf("%lld %lld", &a, &b);

if(a <= b*b)
{
printf("Case %d: 0\n", t++);
continue;
}

long long int num = solve(a);

num /= 2;

for(int i=1; i<b; i++)
{
if(a % i == 0)
num --;
}

printf("Case %d: %lld\n", t++, num);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: