分蛋糕(求满足条件的最小偶数)

Ekka和Dokka计划分享一块蛋糕,其中Ekka偏好奇数大小的份额,而Dokka偏好偶数大小的份额。给定蛋糕的冲劲因子W,该问题探讨如何有效地确定是否存在一种方法将蛋糕分割成所需的比例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EkkaDokka

(要求N是奇数M是偶数并且M还要最小,那么M就从2开始不断+2,判断W/2是否为奇数,如果满足记录此时的M,停止循环)


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.
Ekka和他的朋友Dokka决定买一块蛋糕。他们都喜欢吃蛋糕,这就是为什么他们买了之后想要分享蛋糕的原因。正如它的名字暗示Ekka很喜欢奇数和Dokka很喜欢偶数,他们想把蛋糕这样Ekka得到的N平方厘米,Dokka得到的份额平方厘米,N是奇数和M是偶数。N和M都是正整数。
他们想把蛋糕分成N * M = W,其中W是他们设定的冲劲因子。现在你知道了他们的冲劲因素,你必须知道他们是否能买到想要的蛋糕。


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.
输入从一个整数T(≤10000),表示测试用例的数量。
每个案例都包含一个整数W(2≤W < 263)。W不是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.
对于每个案例,首先打印案例编号。如果他们买不到自己想要的蛋糕,那么在那之后就“不可能”了。如果他们能买到这样的蛋糕,你必须打印N和M。如果有多种解决方案,那么打印出M尽可能小的结果。


Sample Input
3
10
5
12


Sample Output
Case 1: 5 2
Case 2: Impossible
Case 3: 3 4


#include<stdio.h>
#include<cstdio>
#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long ll;
ll num(ll a)
{
    ll i,b=1;
    for(i=2;i<=a;i+=2)
        if(a%i==0&&a/i%2!=0)
        {   b=i;
            return b;
        }
}
int main()
{
    ll t,i,w,j=0;
    scanf("%lld",&t);
    while(t--)
    {   j++;
        scanf("%lld",&w);
        if(w%2!=0)
        {   printf("Case %lld: Impossible\n",j);
            continue;
        }   
        else
        {
            printf("Case %lld: %lld %lld\n",j,w/num(w),num(w));
        }
    }
    return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值