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[N], k, vis[N]; void Prime()
{
k=;
memset(vis, );
for(int i=; i<N; i++)
{
if(!vis[i])
{
prime[k++] = i;
for(int j=i+i; j<N; j+=i)
vis[j] = ;
}
}
}///素数筛选 long long solve(long long n)
{
long long int sum = ; for(int i=; i<k && prime[i]*prime[i]<=n; i++)
{
if(n%prime[i] == )
{
int ans=;
while(n%prime[i] == )
{
ans++;
n /= prime[i];
}
sum *= (+ans);
}
} if(n>)
sum *= ;
return sum;
}///求n得因子个数; int main()
{
int T, t=;
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 /= ; for(int i=; i<b; i++)
{
if(a % i == )
num --;
} printf("Case %d: %lld\n", t++, num);
}
return ;
}