Sgu 330 -- numbers

Source: Internet
Author: User

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;}

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.