题目链接:Ekka Dokka - LightOJ 1116 - Virtual Judge (vjudge.net)
题意:给你一个数x,让你找出满足等式n*m=x的解,其中n为偶数,m为奇数,要求n尽量小。
分析:由质因子分解定理我们可以知道,x可以唯一地由质数表示,又因为只有一个质数2是偶数,所以要想满足等式则必须要有x含有质因子2,其中求最小的偶数n就等价于求最大的奇数m,又因为奇数的质因子分解中不能含有2,所以只需要把x的质因子分解中除了2的质因子乘起来即可得到满足题目要求的m,n也就是x质因子分解中2的贡献。
下面是代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
signed main()
{
int T,n;
cin>>T;
for(int o=1;o<=T;o++)
{
scanf("%lld",&n);
if(n&1)
{
printf("Case %lld: Impossible\n",o);
continue;
}
int t=n,cnt=0;
while(t%2==0) cnt++,t/=2;
if(t!=1)
printf("Case %lld: %lld %lld\n",o,n/(1<<cnt),1<<cnt);
else
printf("Case %lld: Impossible\n",o);
}
return 0;
}