zoukankan      html  css  js  c++  java
  • HDU 6186 number number number 【规律+矩阵快速幂】

    题目链接:

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6198

     题目思路:

    枚举出前三个值,分别为4,12,33.

    可以发现其对应的值是斐波那契数列对应的2*i+3项-1

    所以利用矩阵快速幂求第2*i+3项,将值减一输出即可。

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int NUM=5;
     5 const int mod=998244353;
     6 struct Mat{
     7     int n,m;
     8     ll a[NUM][NUM];
     9 };
    10 Mat mul(Mat a,Mat b)
    11 {
    12     Mat ans;
    13     ans.n=a.n;
    14     ans.m=b.m;
    15     for(int i=0;i<ans.n;++i)
    16     for(int j=0;j<ans.m;++j){
    17         ans.a[i][j]=0;
    18         for(int k=0;k<a.m;++k){
    19             ans.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
    20             ans.a[i][j]%=mod;
    21         }
    22     }
    23     return ans;
    24 }
    25 Mat power(Mat a,int num)
    26 {
    27     Mat ans;
    28     ans.n=2;
    29     ans.m=1;
    30     ans.a[0][0]=ans.a[1][0]=1;
    31     while(num)
    32     {
    33         if(num&1)
    34             ans=mul(ans,a);
    35         num>>=1;
    36         a=mul(a,a);
    37     }
    38     return ans;
    39 }
    40 int main()
    41 {
    42     //freopen("data.txt","r",stdin);
    43     //freopen("out1.txt","w",stdout);
    44     ios::sync_with_stdio(false);
    45     int n;
    46     Mat a;
    47     a.n=a.m=2;
    48     a.a[0][0]=0;
    49     a.a[0][1]=a.a[1][0]=a.a[1][1]=1;
    50     while(cin>>n)
    51     {
    52         Mat ans=power(a,n*2+3);
    53         cout<<((ans.a[0][1]-1)%mod+mod)%mod<<endl;
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    02 小白新一天
    集合排序
    匿名内部类-Lambda表达式
    设计模式之适配器设计
    设计模式之代理设计
    设计模式之工厂设计
    依赖倒转原则
    多态及练习题
    在一个类中调用另外一个类
    对象的三大特性之封装
  • 原文地址:https://www.cnblogs.com/SCaryon/p/7683592.html
Copyright © 2011-2022 走看看