zoukankan      html  css  js  c++  java
  • 1052

    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
    ",xx1,xx2);
    150         //printf("%lld %lld
    ",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
    ");
    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
    ",(xxx1+yyy1)%mod);
    218         }
    219     }
    220     return 0;
    221 }
    油!油!you@
  • 相关阅读:
    简单的python购物车
    MS17-010漏洞复现
    记一次简单的sql注入
    利用钟馗之眼对摄像头入侵
    分流抢票软件浅谈
    一次简单的路由器渗透
    运动目标检测中基于HSV空间的阴影去除算法
    RGB颜色空间、HSV颜色空间的理解
    #ifdef __cplusplus extern "C" { #endif 含义
    Opencv 视频保存为图像
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5592203.html
Copyright © 2011-2022 走看看