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 |
12162427304050525457 |
sample input |
sample output |
3 6 |
Impossible |
如果A是偶數,B是偶數,則一直加A最大的偶約數。否則,把AB加上或減去最小的奇約數,如果不能把他們變成偶數,則不存在。
剩下的數字不會超過500個。
#include<iostream>#include<cstdio>using namespace std;#define LL __int64LL 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;}