1052 - String Growth

1052 - String Growth
Time Limit: 2 second(s) Memory Limit: 32 MB

Zibon just started his courses in Computer science. After having some lectures on programming courses he fell in love with strings. He started to play with strings and experiments on them. One day he started a string of arbitrary (of course positive) length consisting of only {a, b}. He considered it as 1st string and generated subsequent strings from it by replacing all the b's with ab and all the a's with b. For example, if he ith string is abab(i+1)th string will be b(ab)b(ab) = babbab. He found that the Nth string has length X and Mth string has length Y. He wondered what will be length of the Kth string. Can you help him?

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case begins with five integers N, X, M, Y, K. (0 < N, M, X, Y, K < 109 and N ≠ M).

Output

For each case print one line containing the case number and L which is the desired length (mod 1000000007) or the string "Impossible" if it's not possible.

Sample Input

Output for Sample Input

2

3 16 5 42 6

5 1 6 10 9

Case 1: 68

Case 2: Impossible

 


PROBLEM SETTER: MD. TOWHIDUL ISLAM TALUKDER
SPECIAL THANKS: JANE ALAM JAN
思路:矩阵快速幂;
感觉这道题的题意有点问题,所给你的条件不知道是否取模,不过最后错了好几次,,和样例可以确定是没取模。
那么说下思路:Fa(n+1)=Fb(n);F(n+1)=Fa(n)+Fb(n);
 
然后给你两个条件,那么你可以设fa(1)=x;fb(1)=y;然后解方程组,然后判定下方程是否有解,其中x>=0&&y>=0;其中系数用矩阵快速幂算下。
  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<string.h>
  5 #include<stdlib.h>
  6 #include<queue>
  7 #include<math.h>
  8 #include<vector>
  9 using namespace std;
 10 typedef long long LL;
 11 const  LL mod=1e9+7;
 12 LL quick1(LL n,LL m)
 13 {
 14     LL a=1;
 15     while(m)
 16     {
 17         if(m&1)
 18         {
 19             a=(a*n)%mod;
 20         }
 21         n=(n*n)%mod;
 22         m/=2;
 23     }
 24     return a;
 25 }
 26 typedef struct pp
 27 {
 28     LL m[3][3];
 29     pp()
 30     {
 31         memset(m,0,sizeof(m));
 32     }
 33 } maxtr;
 34 void Init(maxtr *ans)
 35 {
 36     int i,j,k;
 37     for(i=0; i<=1; i++)
 38     {
 39         for(j=0; j<=1; j++)
 40         {
 41             if(i==0&&j==0)
 42             {
 43                 ans->m[i][j]=0;
 44             }
 45             else if(i==1&&j==1)
 46             {
 47                 ans->m[i][j]=1;
 48             }
 49             else ans->m[i][j]=1;
 50         }
 51     }
 52 }
 53 maxtr E()
 54 {
 55     maxtr ans;
 56     int i,j;
 57     for(i=0; i<=1; i++)
 58     {
 59         for(j=0; j<=1; j++)
 60         {
 61             if(i==j)
 62             {
 63                 ans.m[i][j]=1;
 64             }
 65             else ans.m[i][j]=0;
 66         }
 67     }
 68     return ans;
 69 }
 70 maxtr quick( maxtr ans,LL m)
 71 {
 72     maxtr cc=E();
 73     while(m)
 74     {
 75         if(m&1)
 76         {
 77             maxtr ak;
 78             int s;
 79             int i,j;
 80             for(i=0; i<=1; i++)
 81             {
 82                 for(j=0; j<=1; j++)
 83                 {
 84                     for(s=0; s<=1; s++)
 85                     {
 86                         ak.m[i][j]=(ak.m[i][j]+(cc.m[s][j]*ans.m[i][s])%mod)%mod;
 87                     }
 88                 }
 89             }
 90             cc=ak;
 91         }
 92         maxtr ak;
 93         int s;
 94         int i,j;
 95         for(i=0; i<=1; i++)
 96         {
 97             for(j=0; j<=1; j++)
 98             {
 99                 for(s=0; s<=1; s++)
100                 {
101                     ak.m[i][j]=(ak.m[i][j]+(ans.m[i][s]*ans.m[s][j])%mod)%mod;
102                 }
103             }
104         }
105         ans=ak;
106         m/=2;
107     }
108     return cc;
109 }
110 LL gcd(LL n, LL m)
111 {
112     if(m==0)
113     {
114         return n;
115     }
116     else if(n%m==0)
117     {
118         return m;
119     }
120     else return gcd(m,n%m);
121 }
122 int main(void)
123 {
124     LL i,j,k;
125     LL s;
126     LL  N, X, M, Y, K;
127     scanf("%d",&k);
128     LL acy;
129     LL acx;
130     for(s=1; s<=k; s++)
131     {
132         int flag=0;
133         scanf("%lld %lld %lld %lld %lld",&N,&X,&M,&Y,&K);
134         if(N>M)
135         {
136             swap(N,M);
137             swap(X,Y);
138         }
139         maxtr ak;
140         Init(&ak);
141         maxtr ac=quick(ak,N-1);
142         maxtr bk;
143         Init(&bk);
144         maxtr aak=quick(bk,M-1);
145         LL xx1=(ac.m[0][0]+ac.m[1][0])%mod;
146         LL yy1=(ac.m[0][1]+ac.m[1][1])%mod;
147         LL xx2=(aak.m[0][0]+aak.m[1][0])%mod;
148         LL yy2=(aak.m[0][1]+aak.m[1][1])%mod;
149         //printf("%lld %lld\n",xx1,xx2);
150         //printf("%lld %lld\n",yy1,yy2);
151         LL ccy=yy1;
152         LL xxN=X;
153         LL t=X;
154         LL xxy=yy2;
155         LL ct=Y;
156         LL yyM=Y;
157         LL gc=gcd(xx1,xx2);
158         yy1*=(xx2/gc);
159         yy2*=(xx1/gc);
160         X*=(xx2/gc);
161         Y*=(xx1/gc);
162         yy1-=yy2;
163         X-=Y;
164         if(X<0&&yy1>0||X>0&&yy1<0)flag=1;
165         {
166             if(X==0)
167             {
168                 acy=0;
169                 if(xxN%xx1)
170                 {
171                     flag=1;
172                 }
173                 else
174                 {
175                     LL ack=quick1(xx1,mod-2);
176                     acx=xxN*ack%mod;
177                 }
178             }
179             else
180             {
181 
182                 if(X%yy1)
183                 {
184                     flag=1;
185                 }
186                 else
187                 {   if(yy1>0&&X<0||yy1<0&&X>0)flag=1;
188                     LL ack=quick1(yy1,mod-2);
189                     acy=X/yy1%mod;
190                     xxN-=ccy*acy;
191                     if(xxN<0)flag=1;
192                     if(xxN%xx1)
193                     {
194                         flag=1;
195                     }
196                     else
197                     {
198                         LL ack=quick1(xx1,mod-2);
199                         acx=xxN/xx1;
200                     }
201                 }
202             }
203 
204         }
205         printf("Case %d: ",s);
206         if(flag)
207         {
208             printf("Impossible\n");
209         }
210         else
211         {
212             maxtr cp;
213             Init(&cp);
214             maxtr akk=quick(cp,K-1);
215             LL xxx1=(akk.m[0][0]+akk.m[1][0])*acx%mod;
216             LL yyy1=(akk.m[0][1]+akk.m[1][1])*acy%mod;
217             printf("%lld\n",(xxx1+yyy1)%mod);
218         }
219     }
220     return 0;
221 }

 

posted @ 2016-06-16 21:25  sCjTyC  阅读(305)  评论(0编辑  收藏  举报