1052 - String Growth

   PDF (English) Statistics Forum
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 }
时间: 2024-08-04 10:33:38

1052 - String Growth的相关文章

帮助类下

#region HTML代码转换成TXT格式 1010 /// <summary> 1011 /// 字符串字符处理 1012 /// </summary> 1013 /// <param name="chr">等待处理的字符串</param> 1014 /// <returns>处理后的字符串</returns> 1015 /// //把HTML代码转换成TXT格式 1016 public static Stri

心理测试题--有点长

心理测验:看看大家是不是受异性喜欢 1 static void Main1111(string[] args) 2 { 3 //心理测验:看看大家是不是受异性喜欢 4 Console.WriteLine("********************心理小测验:看看大家是否受异性喜欢*************"); 5 6 string A = "[♥]:很好!很容易便可以吸引异性.你的幽默感使得人们乐於与你相处,他(她)与你一起时非常快乐!"; 7 string B

插件实例修改3

根据我前2篇项目,又做了更新,把3tab页面合成一个页面,主要用到easyui 页面布局 配置文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <xp-web> 3 <modules> 4 <!-- 第三方APP服务端 --> 5 <module path="/web/plugins/bs/yygl/bz/extapp" form="&quo

插件实例修改

前端框架是easyui框架,后台的框架是我们公司自己写的.做的功能主要是插件修改,使用easyui iframe, tab,datagrid组件 配置文件 <?xml version="1.0" encoding="UTF-8"?> <xp-web> <modules> <!-- 第三方APP服务端 --> <module path="/web/plugins/bs/yygl/bz/extapp&quo

Java微博爬虫-每日百万数据

没写过爬虫,赶鸭子上架,公司里有个老代码,我就拿来参考,边看边写3周后,把整个代码大换血,实现了单日单程序百万的爬取量. 使用springboot + JDK1.8 + mysql + redis. 主要有 关键词爬取.redis队列.多线程爬取程序 三部分. 一.关键词的爬取: 我用的是在微博搜索栏输入关键词的方法爬取数据,所以关键词的热度.新鲜度很重要. 我在百度.搜狗.微博这几个网站的热搜榜每隔40秒抓取一次实时的热词. 第一步,找热词质量高的网站. # 百度热搜网址 baidu.hotn

为什么operator&gt;&gt;(istream&amp;, string&amp;)能够安全地读入长度未知的字符串?

一般而言,实现"读入用户输入的字符串",程序中自然不能对用户输入的长度有所限定.这在C++中很容易实现,而在C中确没那么容易. 这一疑问,我在刚学C++的时候也在脑中闪现过:不过很快将它抛在脑后了.直到最近,我在百度知道上讨论一个单词统计问题(链接)时,才重新想起.于是,翻出gcc 4.6.1的代码,浏览了一番. 首先,明确这里探讨的场景--从标准输入(或字符模式打开的文件)中读取一个字符串(换行.空格.tab间隔均可).用C++实现这一功能有两种选择--使用C标准库和使用C++标准库

POJ 1052 Plato&#39;s Blocks

Plato's Blocks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 734   Accepted: 296 Description Plato believed what we perceive is but a shadow of reality. Recent archaeological excavations have uncovered evidence that this belief may hav

【BZOJ】1052: [HAOI2007]覆盖问题(贪心)

http://www.lydsy.com/JudgeOnline/problem.php?id=1052 首先膜拜题解orz,表示只能想到二分... 贪心就是每一次找到一个最小的能包围所有点的矩阵,然后枚举四个角放正方形. 不会证QAQ 然后被sb错吊打了半小时... 又是自以为的开全局变量没想到局部改变... #include <cstdio> #include <cstring> #include <cmath> #include <string> #i

PAT 1052. Linked List Sorting (25)

1052. Linked List Sorting (25) A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, yo