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 }

最新文章

  1. Java中将0x开头的十六进制字符串转换成十进制整数
  2. 面向.Net程序员的后端性能优化实战
  3. USACO Section 2.3: Controlling Companies
  4. 2016 系统设计第一期 (档案一)jQuery ajax serialize()方法form提交数据
  5. 关于ThinkPHP中Session不能夸模块/控制器使用的问题-网上的答案我做个补充
  6. easyui源码翻译1.32--TimeSpinner(时间微调)
  7. Android开发UI之Action Bar
  8. [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)
  9. linux磁盘管理、新增磁盘、分区、挂载
  10. [Android学习笔记]Android Library Project的使用
  11. [MySQL] mysql 的行级显式锁定和悲观锁
  12. Cocos Creator_继承组件单例
  13. js-ES6学习笔记-Set和Map数据结构
  14. HDU 6020---MG loves apple(枚举)
  15. Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析
  16. iOS 新浪微博-1.1框架升级
  17. vue组件定义方式
  18. 2017-2018-1 Java演绎法 第九、十周 作业
  19. JBOSS-EAP-6.2集群部署
  20. redis内网无法连接的问题

热门文章

  1. kubernetes部署Docker私有仓库Registry
  2. opencv学习(三)——绘图功能
  3. 一站式Flink&amp;Spark平台解决方案——StreamX
  4. C/C++ Qt 数据库与TreeView组件绑定
  5. LeetCode替换空格
  6. flink01--------1.flink简介 2.flink安装 3. flink提交任务的2种方式 4. 4flink的快速入门 5.source 6 常用算子(keyBy,max/min,maxBy/minBy,connect,union,split+select)
  7. Set &amp;&amp; Map
  8. 【leetcode】653. Two Sum IV - Input is a BST
  9. rust常用技巧
  10. mysql死锁com.mysql.cj.jdbc.exception.MYSQLTransactionRollbackException Deadlock found when trying to get lock;try restarting transaction