• 1065


    1065 - Number Sequence
    Time Limit: 2 second(s) Memory Limit: 32 MB

    Let's define another number sequence, given by the following function:

    f(0) = a

    f(1) = b

    f(n) = f(n-1) + f(n-2), n > 1

    When a = 0 and b = 1, this sequence gives the Fibonacci sequence. Changing the values of a and b, you can get many different sequences. Given the values of a, b, you have to find the last m digits of f(n).

    Input

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

    Each test case consists of a single line containing four integers a b n m. The values of a and b range in [0,100], value of n ranges in [0, 109] and value of m ranges in [1, 4].

    Output

    For each case, print the case number and the last m digits of f(n). However, do NOT print any leading zero.

    Sample Input

    Output for Sample Input

    4

    0 1 11 3

    0 1 42 4

    0 1 22 4

    0 1 21 4

    Case 1: 89

    Case 2: 4296

    Case 3: 7711

    Case 4: 946


    Special Thanks: Jane Alam Jan (Solution, Dataset)
    矩阵快速幂水题
      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 typedef struct pp
     12 {
     13         LL m[4][4];
     14         pp()
     15         {
     16                 memset(m,0,sizeof(m));
     17         }
     18 } maxtr;
     19 maxtr E()
     20 {
     21         maxtr ans;
     22         int i,j;
     23         for(i=0; i<4; i++)
     24         {
     25                 for(j=0; j<4; j++)
     26                 {
     27                         if(i==j)
     28                         {
     29                                 ans.m[i][j]=1;
     30                         }
     31                         else ans.m[i][j]=0;
     32                 }
     33         }
     34         return ans;
     35 }
     36 void Init (maxtr *p)
     37 {   int i,j;
     38         for(i=0; i<2; i++)
     39         {
     40                 for(j=0; j<2; j++)
     41                 {
     42                         if(i==1&&j==1)
     43                         {
     44                                 p->m[i][j]=0;
     45                         }
     46                         else  p->m[i][j]=1;
     47                 }
     48         }
     49 }
     50 maxtr quick(maxtr ans ,int m,int mod)
     51 {
     52         maxtr ak=E();
     53         int i,j;
     54         while(m)
     55         {
     56                 if(m&1)
     57                 {
     58                         maxtr cc;
     59                         for(i=0; i<2; i++)
     60                         {
     61                                 for(j=0; j<2; j++)
     62                                 {
     63                                         for(int s=0; s<2; s++)
     64                                         {
     65                                                 cc.m[i][j]=(cc.m[i][j]+ans.m[i][s]*ak.m[s][j]%mod)%mod;
     66                                         }
     67                                 }
     68                         }
     69                         ak=cc;
     70                 }
     71                 maxtr cc;
     72                 for(i=0; i<2; i++)
     73                 {
     74                         for(j=0; j<2; j++)
     75                         {
     76                                 for(int s=0; s<2; s++)
     77                                 {
     78                                         cc.m[i][j]=(cc.m[i][j]+ans.m[i][s]*ans.m[s][j]%mod)%mod;
     79                                 }
     80                         }
     81                 }
     82                 ans=cc;
     83                 m/=2;
     84         }
     85         return ak;
     86 }
     87 int main(void)
     88 {
     89         int i,j,k;
     90         int s;
     91         scanf("%d",&k);
     92         int a,b,n,m;
     93         for(s=1; s<=k; s++)
     94         {
     95                 scanf("%d %d %d %d",&a,&b,&n,&m);
     96                 printf("Case %d: ",s);
     97                 if(n==0)
     98                 {
     99                         printf("%d
    ",a%m);
    100                 }
    101                 else if(n==1)
    102                 {
    103                         printf("%d
    ",b%m);
    104                 }
    105                 else
    106                 {
    107                         maxtr ak;
    108                         Init(&ak);
    109                         int mod=1;
    110                         for(i=1;i<=m;i++)
    111                             mod*=10;
    112                         ak=quick(ak,n-1,mod);
    113                         LL ask=ak.m[0][0]*b+ak.m[0][1]*a;
    114                         ask%=mod;
    115                         printf("%lld
    ",ask);
    116                 }
    117         }
    118         return 0;
    119 }
    1065
      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 unsigned long long LL;
     11 typedef long long L;
     12 typedef struct pp
     13 {
     14         LL m[4][4];
     15         pp()
     16         {
     17                 memset(m,0,sizeof(m));
     18         }
     19 } maxtr;
     20 maxtr E()
     21 {
     22         int i,j;
     23         maxtr ans;
     24         for(i=0; i<=3; i++)
     25         {
     26                 for(j=0; j<=3; j++)
     27                 {
     28                         if(i==j)
     29                                 ans.m[i][j]=1;
     30                         else ans.m[i][j]=0;
     31                 }
     32         }
     33         return ans;
     34 }
     35 void Init(maxtr *p,LL x,LL y)
     36 {
     37         int i,j;
     38         memset(p->m,0,sizeof(p->m));
     39         p->m[0][0]=x;
     40         p->m[0][1]=-y;
     41         p->m[1][0]=1;
     42 }
     43 maxtr quick(maxtr ak,LL m)
     44 {
     45         int i,j,s;
     46         maxtr ac=E();
     47 
     48         while(m)
     49         {
     50                 if(m&1)
     51                 {
     52                         maxtr cc;
     53                         for(i=0; i<2; i++)
     54                         {
     55                                 for(j=0; j<2; j++)
     56                                 {
     57                                         for(s=0; s<2; s++)
     58                                         {
     59                                                 cc.m[i][j]=(cc.m[i][j]+ak.m[i][s]*ac.m[s][j]);
     60                                         }
     61                                 }
     62                         }
     63                         ac=cc;
     64                 }
     65                 maxtr cc;
     66                 for(i=0; i<2; i++)
     67                 {
     68                         for(j=0; j<2; j++)
     69                         {
     70                                 for(s=0; s<2; s++)
     71                                 {
     72                                         cc.m[i][j]=(cc.m[i][j]+ak.m[i][s]*ak.m[s][j]);
     73                                 }
     74                         }
     75                 }
     76                 ak=cc;
     77                 m/=2;
     78         }
     79         return ac;
     80 }
     81 int main(void)
     82 {
     83         int i,j,k;
     84         scanf("%d",&k);
     85         int s;
     86         for(s=1; s<=k; s++)
     87         {
     88                 LL x,y,z;
     89                 scanf("%llu %llu %llu",&x,&y,&z);
     90                 LL f1=1;
     91                 LL f2=x;
     92                 LL f3=x*x-2*y;
     93                 maxtr ans;
     94                 Init(&ans,x,y);
     95                 printf("Case %d: ",s);
     96                 if(z==1)
     97                 {
     98                         printf("%llu
    ",x);
     99                 }
    100                 else if(z==2)
    101                 {
    102                         printf("%llu
    ",f3);
    103                 }
    104                 else if(z==0)
    105                 {
    106                     printf("2
    ");
    107                 }
    108                 else
    109                 {
    110                        ans= quick(ans,z-2);
    111                         LL ak=ans.m[0][0]*f3+ans.m[0][1]*f2;
    112                         printf("%llu
    ",ak);
    113                 }
    114         }
    115         return 0;
    116 }
    1070
    油!油!you@
  • 相关阅读:
    SDN课程阅读作业(2)
    2019 SDN上机第4次作业
    第11组 Alpha事后诸葛亮
    第11组 Alpha冲刺(6/6)
    第11组 Alpha冲刺(5/6)
    2019 SDN上机第3次作业
    2019 SDN阅读作业
    第11组 Alpha冲刺(4/6)
    第11组 Alpha冲刺(3/6)
    模式识别和机器学习、数据挖掘的区别与联系(转发)
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5595179.html
Copyright © 2020-2023  润新知