C - Aladdin and the Flying Carpet (质因子分解,因子个数)

C - Aladdin and the Flying Carpet

题目链接:https://vjudge.net/problem/LightOJ-1341#author=2018112767

题目大意:

给一对数字 a,b 。其中,a表示一个矩形的面积,想知道有多少种整数的边的组合可以组成面积为a的矩形,而且要求矩形的最短的边不得小于b。

解题思路:

先算出a的因子数,然后由公式因子个数num=(q1+1)*(q2+1)......*(qn+1).求出num后再除以2,得到的就是所有面积等于a的整数对的个数,因为要小于b,b的范围较小(题中未给。。。),所以遍历1到b,num减去最小的边小于b的矩形个数,得到的就是答案。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll N=1e6+7;
 5 ll isprime[N],prime[N];
 6 ll m,T;
 7 void primes(){
 8     memset(isprime,0,sizeof(isprime));
 9     m=0;
10     for(ll i=2;i<=N;i++){
11         if(isprime[i]==0){
12             isprime[i]=i;
13             prime[++m]=i; 
14         }
15         for(ll j=1;j<=m;j++){
16             if(prime[j]>isprime[i] ||prime[j]*i>N )  break;
17             isprime[i*prime[j]]=prime[j];
18         }
19     }
20 }
21 
22 int main(){
23     ll n,test=0;
24     primes();
25     cin>>T;
26     while(T--){
27         ll ans=1,num,a,b;
28         scanf("%lld%lld",&a,&b);
29         if(b*b>=a){
30             printf("Case %lld: 0\n",++test);
31             continue;
32         }
33         n=a;
34         for(ll i=1;i<=m&&prime[i]*prime[i]<=n;i++){
35             num=0;
36             while(n%prime[i]==0){
37                 num++;
38                 n/=prime[i];
39             }
40             ans*=(num+1);
41         }
42         if(n!=1){
43             ans*=2;
44         }
45         ans/=2;
46         for(ll i=1;i<b;i++){
47             if(a%i==0){
48                 ans--;
49             }
50         }
51         printf("Case %lld: %lld\n",++test,ans);
52     }
53     return 0;
54 }

 

posted @ 2020-03-02 17:24  yya雨  阅读(172)  评论(0编辑  收藏  举报