Description
Young Andrew is playing yet another numbers game. Initially, he writes down an integer A. Then, he chooses some divisor d1 of A, 1 < d1 < A, erases A and writes A1=A+ d1 instead. Then, he chooses some divisor d2 of A1, 1 < d2 < A1, erases A1 and writes A2=A 1+ d2 instead.
I.e., at any step he chooses some positive integer divisor of the current number, but not 1 and not the whole number, and increases the current number by it.
Is it possible for him to write number B if he started with number A?
Input
The only line of input contains two integers A and
B, 2 ≤ A < B ≤ 10 12.
Output
If there's no solution, output "
Impossible
" (without quotes) to the only line of output. If there's one, output the sequence of numbers written starting with
A and ending with B, one per line. You're not asked to find the shortest possible sequence, however, you should find a sequence with no more than 500 numbers. It is guaranteed that if there exists some sequence for the given
A and B, then there exists a sequence with no more than 500 numbers in it.Sample Input
sample input |
sample output |
12 57 |
12 16 24 27 30 40 50 52 54 57 |
sample input |
sample output |
3 6 |
Impossible |
如果A是偶数,B是偶数,则一直加A最大的偶约数。否则,把AB加上或减去最小的奇约数,如果不能把他们变成偶数,则不存在。
剩下的数字不会超过500个。
#include<iostream>
#include<cstdio>
using namespace std;
#define LL __int64
LL prime[1000006];
bool p[1100006];
LL cnt;
void init()
{
LL i,j;
cnt=0;
for(i=2;i<=1000000;i++)
if(!p[i])
{
prime[++cnt]=i;
for(j=i*i;j<=1000000;j+=i)
p[j]=1;
}
}
int main()
{
LL X,Y;
LL x,y;
init();
cin>>X>>Y;
if(x==2)
{
cout<<"Impossible"<<endl;
return 0;
}
x=X;
y=Y;
if(x&1)
{
for(LL i=1;i<=cnt;i++)
if(x%prime[i]==0&&prime[i]!=x)
{
x+=prime[i];
break;
}
}
if(y&1)
{
for(LL i=1;i<=cnt;i++)
if(y%prime[i]==0&&prime[i]!=y)
{
y-=prime[i];
break;
}
}
if((x&1)||(y&1)||x>y)
{
cout<<"Impossible"<<endl;
return 0;
}
LL c=0;
LL ans[1600];
ans[++c]=X;
if(x!=X)
ans[++c]=x;
while(x<y)
{
LL temp=x;
while(temp%2==0)
temp/=2;
temp=x/temp;
if(temp==x)
temp/=2;
while(x+temp>y)
temp/=2;
x+=temp;
ans[++c]=x;
}
if(y!=Y)
ans[++c]=Y;
for(LL i=1;i<=c;i++)
printf("%I64d\n",ans[i]);
return 0;
}
508

被折叠的 条评论
为什么被折叠?



