码迷,mamicode.com
首页 > 其他好文 > 详细

LIGHT OJ 1116 - Ekka Dokka

时间:2018-03-06 17:08:07      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:tab   string   print   math   eth   das   include   math.h   while   

Ekka and his friend Dokka decided to buy a cake. They both love cakes and that‘s why they want to share the cake after buying it. As the name suggested that Ekka is very fond of odd numbers and Dokka is very fond of even numbers, they want to divide the cake such that Ekka gets a share of N square centimeters and Dokka gets a share of M square centimeters where N is odd and M is even. Both N and M are positive integers.

They want to divide the cake such that N * M = W, where W is the dashing factor set by them. Now you know their dashing factor, you have to find whether they can buy the desired cake or not.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case contains an integer W (2 ≤ W < 263). And W will not be a power of 2.

Output

For each case, print the case number first. After that print "Impossible" if they can‘t buy their desired cake. If they can buy such a cake, you have to print N and M. If there are multiple solutions, then print the result where M is as small as possible.

Sample Input

Output for Sample Input

3

10

5

12

Case 1: 5 2

Case 2: Impossible

Case 3: 3 4

 

题意概要:给你一个数字W,W不是2的任何正整数次幂,要求你给出N和M两个数
N和M要满足下面要求。
N*M=W
N为奇数
M为偶数
M要尽量的小
 
分析:
当我们通过W找N和M时。
我们可以将W分离成若干个质因子。
W所有偶数的质因子的乘积就是M
W所有奇数的质因子的乘积就是N
因为M是W所有偶数质因子的乘积,所以不会有比M更小的满足N*M=W且N为奇数的数。
(既是偶数又是质数的只有2,所有如果存在M,M必定是2的整数幂,可以利用这个特点便捷计算M,从而求出N)
 
代码:
#include <cstdio>
#include <cstring>
#include <math.h>
#define ll long long

int main()
{
    int T,Case=1,ans;
    ll w,m;
    scanf("%d",&T);
    while(T--)
    {
        m=2;
        ans=0;
        scanf("%lld",&w);
        while(m<=w/2)///这句话既是终止条件也是为了防止long long类型溢出
        {
            if(w%m==0&&(w/m)%2==1)
            {
                ans=1;
                break;
            }
            m*=2;
        }

        if(ans)
            printf("Case %d: %lld %lld\n",Case++,w/m,m);
        else
            printf("Case %d: Impossible\n",Case++);
    }
    return 0;
}

 

LIGHT OJ 1116 - Ekka Dokka

标签:tab   string   print   math   eth   das   include   math.h   while   

原文地址:https://www.cnblogs.com/zhangzehua/p/8514773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!