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 }