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 的标准分解式
我们求出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; }