• hdu So Easy!


    So Easy!

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2026    Accepted Submission(s): 624


    Problem Description
      A sequence Sn is defined as:

    Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example, ┌3.14┐=4. You are to calculate Sn.
      You, a top coder, say: So easy! 
     
    Input
      There are several test cases, each test case in one line contains four positive integers: a, b, n, m. Where 0< a, m < 215, (a-1)2< b < a2, 0 < b, n < 231.The input will finish with the end of file.
     
    Output
      For each the case, output an integer Sn.
     
    Sample Input
    2 3 1 2013
    2 3 2 2013
    2 2 1 2013
     
    Sample Output
    4
    14
    4
     
    Source
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<cstdlib>
     5 using namespace std;
     6 typedef __int64 LL;
     7 
     8 LL  p ;
     9 struct Matrix
    10 {
    11     LL mat[3][3];
    12     void init()
    13     {
    14         mat[1][1]=1;mat[1][2]=0;
    15         mat[2][1]=0;mat[2][2]=1;
    16     }
    17     void mem(LL a,LL b)
    18     {
    19         mat[1][1]=(2*a)%p; mat[1][2]=(b-a*a)%p;
    20         mat[2][1]=1;     mat[2][2]=0;
    21     }
    22 };
    23 Matrix multiply(Matrix cur,Matrix ans)
    24 {
    25     Matrix now;
    26     memset(now.mat,0,sizeof(now.mat));
    27     int i,j,k;
    28     for(i=1;i<=2;i++)
    29     {
    30         for(k=1;k<=2;k++)
    31         {
    32             for(j=1;j<=2;j++)
    33             {
    34                 now.mat[i][j]+=cur.mat[i][k]*ans.mat[k][j];
    35                 now.mat[i][j]%=p;
    36                 while(now.mat[i][j]<0) now.mat[i][j]+=p;
    37             }
    38         }
    39     }
    40     return now;
    41 }
    42 void pow_mod(Matrix cur,LL n,LL a,LL b)
    43 {
    44     Matrix ans;
    45     ans.init();
    46     while(n)
    47     {
    48         if(n&1) ans=multiply(ans,cur);
    49         n=n>>1;
    50         cur=multiply(cur,cur);
    51     }
    52     LL sum=(ans.mat[1][1]*2*a+ans.mat[1][2]*2)%p;
    53     printf("%I64d
    ",sum);
    54 }
    55 int main()
    56 {
    57     LL a,b,n;
    58     while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&p)>0)
    59     {
    60         Matrix hxl;
    61         hxl.mem(a,b);
    62         if(n>1)
    63         pow_mod(hxl,n-1,a,b);
    64         else printf("%I64d
    ",(2*a)%p);
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    7月6日实习日志
    7月5日实习日志
    7月4日实习日志
    emacs设置tab缩进
    {{badmatch, {error, eexist}}
    windows下使用emacs+plink远程编辑erlang文件
    cowboy跨域请求处理
    erlang的base64解码问题
    Erlang-VM节点启动名冲突问题
    laya在微信小游戏中加载BitmapFont失效的问题
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3757901.html
Copyright © 2020-2023  润新知