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

http://lightoj.com/volume_showproblem.php?problem=1341

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

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

我们求出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[N], k, vis[N];

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;
}

 

posted @ 2016-05-25 21:04  啦咯  阅读(385)  评论(0编辑  收藏  举报