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

Posted meant to be

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于C - Aladdin and the Flying Carpet (质因子分解,因子个数)的主要内容,如果未能解决你的问题,请参考以下文章

Aladdin and the Flying Carpet(唯一分解定理)

数论专题第三题 :C - Aladdin and the Flying Carpet

E - Aladdin and the Flying Carpet

LightOJ 1342 Aladdin and the Magical Sticks [想法题]

LightOJ 1341(Aladdin and the Flying Carpet )算术基本定理

Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)