Description
Young Andrew is playing yet another numbers game. Initially, he writes down an integer
A. Then, he chooses some DivisorD1
A, 1 <D1 <
A, ErasesAAnd writesA1 = a +
D1 instead. Then, he chooses some Divisor
D2A1, 1 <
D2 <A1. erases
A1 and writesA2 =
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 numberBIf he started with numberA?
Input
The only line of input contains two integers
AAnd
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
AAnd endingB, One per line. you're not asked to find the shortest possible sequence, however, you shoshould find a sequence with no more than 500 numbers. it is guaranteed that if there exists some sequence for the given
AAndB, 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 |
If a is an even number and B is an even number, always add the maximum number of even orders of. Otherwise, the AB is added or subtracted from the smallest odd number. If they cannot be changed to an even number, it does not exist.
The remaining number cannot exceed 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;}