您的位置:首页 > 其它

C - Aladdin and the Flying Carpet 有多少种长方形满足面积为a(<=10^12),且最短边>=b;长方形边长为整数,且一定不可以是正方形。

2017-03-24 20:37 253 查看
/**
题目:C - Aladdin and the Flying Carpet
链接:https://vjudge.net/contest/154246#problem/C
题意:有多少种长方形满足面积为a,且最短边>=b;长方形边长为整数,且一定不可以是正方形。
思路:求出a的素因子以及每个素因子的个数,然后搜索所有满足条件的方法数。
其实可以求出所有<b的方法数,用总的减去它,可以更快,不过更麻烦。
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+100;
ll prime[maxn];
int z;
vector<ll>v;
int num[104];
int cous;
ll a, b;
void init()
{
memset(prime, 0, sizeof prime);
for(int i = 2; i < maxn; i++){
if(prime[i]==0){
for(int j = i+i; j < maxn; j+=i){
prime[j] = 1;
}
}
}
z = 0;
for(int i = 2; i < maxn; i++){
if(prime[i]==0){
prime[z++] = i;
}
}
///  cout<<"prime number = "<<z<<endl; 78000ge
}
ll ans;
void solve(int h,ll value)
{
if(h==0){
if(value>=b&&a/value>=b&&value*value!=a) ans++;
return;
}
for(int i = 0; i <= num[h-1]; i++){
if(i>0){
value*=v[h-1];
}
solve(h-1,value);
}
}
int main()
{
init();
int T, cas=1;
cin>>T;
while(T--)
{
int cnt = 0;
scanf("%lld%lld",&a,&b);
v.clear();
ll n = a;
cous = 0;
memset(num, 0, sizeof num);
for(int i = 0; i < z&&prime[i]*prime[i]<=n; i++){
if(n%prime[i]==0){
v.push_back(prime[i]);
while(n%prime[i]==0){
n/=prime[i];
num[cous]++;
}
cous++;
}
}
if(n>1){
v.push_back(n);
num[cous++] = 1;
}
ans = 0;
solve(cous,1);
printf("Case %d: %lld\n",cas++,ans/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐