1. 程式人生 > >【light 1341Aladdin and the Flying Carpet】

【light 1341Aladdin and the Flying Carpet】

給你矩形的面積(矩形的邊長都是正整數),讓你求最小的邊大於等於b的矩形的個數。

肯定是和麵積的因子有關係了,邊長都是面積值的 因子。
那麼就可以算出面積值得所有因子,因為是讓求得矩形得個數,當然是要<<1了,
還有個限制條件就是最小得邊長要大於等於b得,
那麼把小於b得因子減去,得到的值就是符合條件的對數了

2
10 2
12 2
Sample Output
Case 1: 1
Case 2: 2

#include <iostream>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int prime[maxn];
bool notprime[maxn];
ll n,area;
void getprime(){
	memset(prime,0,sizeof(prime));
	memset(notprime,false,sizeof(notprime));
	notprime[0]=notprime[1]=true;
	for(int i=2;i<maxn;++i){
		if(!notprime[i]) prime[++prime[0]]=i;
			for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;++j){
				notprime[prime[j]*i]=1;
				if(i%prime[j]==0)
					break;
		}
	}
}
int solve(){
	if(area/n<n)return 0;
	int ans=1;
	ll temp=area;
	for(int i=1; area/prime[i]>=prime[i];++i){
			int cnt=0;
			if(area%prime[i]==0){
			while(area%prime[i]==0){
				area/=prime[i];
				cnt++;
			}
			ans*=(cnt+1);		
		}
	}
	if(area>1)
	    ans<<=1; 
	ans>>=1; 
	//as an cloculsion:
	//n have how many pairs of factors can be: n the number of factors divided by 2
	for(int i=1;i<n;++i){// because of the other factor  greater or equal n
		if(temp%i==0)
			--ans;
}
return ans;
}
int main(){
	getprime();
	int t;
	scanf("%d",&t);//in>>t;
	for(int ca=1;ca<=t;++ca){
		scanf("%lld%lld",&area,&n);
		printf("Case %d: %d\n",ca,solve());
	}
	return 0;
}