C

/**
题目: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
",cas++,ans/2);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xiaochaoqun/p/6613293.html