LightOJ1341——Aladdin and the Flying Carpet

It’s said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summons a powerful Genie. Here we are concerned about the first mystery.
Aladdin was about to enter to a magical cave, led by the evil sorcerer who disguised himself as Aladdin’s uncle, found a strange magical flying carpet at the entrance. There were some strange creatures guarding the entrance of the cave. Aladdin could run, but he knew that there was a high chance of getting caught. So, he decided to use the magical flying carpet. The carpet was rectangular shaped, but not square shaped. Aladdin took the carpet and with the help of it he passed the entrance.
Now you are given the area of the carpet and the length of the minimum possible side of the carpet, your task is to find how many types of carpets are possible. For example, the area of the carpet 12, and the minimum possible side of the carpet is 2, then there can be two types of carpets and their sides are: {2, 6} and {3, 4}.
Input
Input starts with an integer T (≤ 4000), denoting the number of test cases.
Each case starts with a line containing two integers: a b (1 ≤ b ≤ a ≤ 1012) where a denotes the area of the carpet and b denotes the minimum possible side of the carpet.
Output
For each case, print the case number and the number of possible carpets.
Sample Input
2
10 2
12 2
Sample Output
Case 1: 1
Case 2: 2

这题是要将一个数a分解为因数,且因数不能小于b,求有多少对
用到的是唯一分解定理+分解质因数
首先是将素数打表,然后分解计算每个素数的幂,然后利用
s=(1+a1)(1+a2)…*(1+an) 计算得到,然后注意除以2

代码:

/算术基本定理
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1000050;
bool prime[N];
int p[N];
int k;
void get_prime(){
    k=0;
    memset(prime,true,sizeof(prime));
    for(int i=2;i<N;i++){
        if(prime[i]){
            p[k++]=i;
            for(int j=2*i;j<N;j+=i){
                prime[j]=false;
            }
        }
    }
}
long long get_factor(long long n){
    long long i;
    long long ans=1;
    for(i=0;i<k && p[i]*p[i]<=n;i++){
        int cnt=0;
        if(n%p[i]==0){
            while(n%p[i]==0){
                cnt++;
                n/=p[i];
            }
        }
        ans=ans*(1+cnt);
    }
    if(n>1){
        ans*=2;
    }
    return ans;
}
int main(void){
    //printf("%lld\n",get_factor(12));
    get_prime();
    int t;
    long long a,b;
    scanf("%d",&t);
    int c=1;
    while(t--){
        scanf("%lld%lld",&a,&b);
        if(b*b>=a){
            printf("Case %d: %d\n",c++,0);
            continue;
        }
        long long ans=get_factor(a);
        for(int i=1;i<b;i++){
            if(a%i==0){
                ans-=2;
            }
        }
        printf("Case %d: %lld\n",c++,ans/2);
    }
}
全部评论

相关推荐

05-20 02:34
已编辑
华中科技大学 游戏策划
ResourceUtilization:你是我见过最美丽的牛客女孩你的眼睛里面有星星
投递腾讯等公司6个岗位
点赞 评论 收藏
分享
头像
05-16 12:47
已编辑
中国地质大学(武汉) Java
你出生在农村,与其它农村小孩子无异小学时你对成绩没有概念,只感觉上课不听课也是无聊,只知道不写完作业会被老师罚站一到考试,自己成绩总是名列靠前,即使偶尔落后,你也从不在意中学时你觉得课本的东西很简单,随便学学就会了,并没有大量刷题你总是想不通,那些所谓的数学物理中难题,明明是在送分,为什么你的同学总是想不出解题方法高中时这三年你过的不容易,晚睡早起,给了自己很多压力.但是你也发现自己是有些小聪明的,你感觉班里有些同学很刻苦,但成绩比你差远了。那些数学题和物理题的陷阱,同学一遍遍踩坑,但是你总能发现并避开它们.“为了父母的期盼,为了恩师的厚望,为了天赐的智慧,为了青春的理想......”“天行健...
创作助手_刘北:其实,这种已经是神童级别的了,不费吹灰之力就能拿到自己想要的东西,就像机器按照程序走了一遍,就像我小时候看爱情公寓,觉得他们都很惨,几个人只能挤在一个房间里合租,但是好在他们有一群非常好的朋友,随着时间的推移,慢慢长大了,在看爱情公寓的时候,觉得他们都很厉害,博士、留学生、***、电台公子,数学天才,任何一个都是我可望而不可即的,更别说可以在异地认识一群更好的朋友了,所以呢,人还是要自给自足,满足当下,不要攀比,意气风发的且有理想的18岁少年永远都存在,只不过随着时间的推移他被你包裹在了洋葱的最深处。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务