hdoj 4990 Reading comprehension(矩阵快速幂)


找到递推式,接下来构造矩阵就可以了。

还要注意用long long存矩阵

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m;

struct node
{
    ll s[3][3];
    node() {}
    node(ll a, ll b, ll c, ll d, ll e, ll f, ll g, ll h, ll i)
    {
        s[0][0] = a;
        s[0][1] = b;
        s[0][2] = c;
        s[1][0] = d;
        s[1][1] = e;
        s[1][2] = f;
        s[2][0] = g;
        s[2][1] = h;
        s[2][2] = i;
    }
};

node mul(node a, node b)
{
    node t;
    memset(t.s, 0, sizeof(t.s));
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 3; k++)
                t.s[i][j] = (t.s[i][j]+a.s[i][k]*b.s[k][j])%m;
    return t;
}

node mt_pow(node p, int n)
{
    node q;
    memset(q.s, 0, sizeof(q.s));
    q.s[0][0] = q.s[1][1] = q.s[2][2] = 1;
    while(n)
    {
        if(n&1) q = mul(p, q);
        p = mul(p, p);
        n /= 2;
    }
    return q;
}

int main(void)
{
    ll n;
    while(cin >> n >> m)
    {
        if(n == 1) printf("%d\n", 1%m);
        else if(n == 2) printf("%d\n", 2%m);
        else
        {
            node base = node(1, 2, 1, 1, 0, 0, 0, 0, 1);
            node ans = mt_pow(base, n-2);
            printf("%lld\n", (ans.s[0][0]*2+ans.s[0][1]+ans.s[0][2])%m);
        }
    }
    return 0;
}


Reading comprehension

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


Problem Description
Read the program below carefully then answer the question.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include<iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include<vector>

const int MAX=100000*2;
const int INF=1e9;

int main()
{
  int n,m,ans,i;
  while(scanf("%d%d",&n,&m)!=EOF)
  {
    ans=0;
    for(i=1;i<=n;i++)
    {
      if(i&1)ans=(ans*2+1)%m;
      else ans=ans*2%m;
    }
    printf("%d\n",ans);
  }
  return 0;
}
 

Input
Multi test cases,each line will contain two integers n and m. Process to end of file.
[Technical Specification]
1<=n, m <= 1000000000
 

Output
For each case,output an integer,represents the output of above program.
 

Sample Input
  
  
1 10 3 100
 

Sample Output
  
  
1 5
 

Source
 

Recommend
heyang   |   We have carefully selected several similar problems for you:   5932  5931  5930  5929  5928 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值