大凤号装甲空母
时间限制: 1 Sec 内存限制: 128 MB
提交: 108 解决: 15
[提交] [状态] [命题人:admin]
题目描述
大凤号航空母舰很喜欢算术。
它,是旧日本海军中最为先进的航空母舰。
它,是旧日本海军中最为短命的航空母舰。
同时,她还是最平的航空母舰(龙骧:你说啥?)
如此多第一 ……
一生二,二生三,三生万物 ……
这也许就是大凤喜欢算术的原因吧。
有一天,她看到了这样一道题:
令
电探发现了来自远处的鱼雷,时间不多了。
输入
一行由空格隔开的两个非负整数,分别是n和p。
输出
一行表示答案。
样例输入
复制样例数据
5 97
样例输出
11
提示
时间限制: 1 Sec 内存限制: 128 MB
提交: 108 解决: 15
[提交] [状态] [命题人:admin]
题目描述
大凤号航空母舰很喜欢算术。
它,是旧日本海军中最为先进的航空母舰。
它,是旧日本海军中最为短命的航空母舰。
同时,她还是最平的航空母舰(龙骧:你说啥?)
如此多第一 ……
一生二,二生三,三生万物 ……
这也许就是大凤喜欢算术的原因吧。
有一天,她看到了这样一道题:
令
电探发现了来自远处的鱼雷,时间不多了。
输入
一行由空格隔开的两个非负整数,分别是n和p。
输出
一行表示答案。
样例输入
复制样例数据
5 97
样例输出
11
提示
解题思路:
通过打表,得
可以推出对于⌊xn⌋\lfloor x^n \rfloor⌊xn⌋的值dp[n]dp[n]dp[n]满足:
dp[n]=f[n]+f[n−2]dp[n]=f[n]+f[n-2]dp[n]=f[n]+f[n−2]即dp[n]=f[n−1]+2∗f[n−2]dp[n]=f[n-1]+2*f[n-2]dp[n]=f[n−1]+2∗f[n−2]
当nn%2==1n时:dp[n]dp[n]dp[n]
否则 :dp[n]−1dp[n]-1dp[n]−1
因此可以通过矩阵快速幂来快速计算dp[n]dp[n]dp[n],可得:
∣dp[n]f[n]f[n−1]000000∣\begin{vmatrix} dp[n] & f[n] & f[n-1]\\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{vmatrix}∣∣∣∣∣∣dp[n]00f[n]00f[n−1]00∣∣∣∣∣∣ =∣0f[1]f[0]000000∣\begin{vmatrix} 0& f[1] & f[0]\\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{vmatrix}∣∣∣∣∣∣000f[1]00f[0]00∣∣∣∣∣∣*∣000111211∣n\begin{vmatrix} 0 & 0 & 0\\ 1 & 1 & 1 \\ 2 & 1 & 1 \end{vmatrix}^n∣∣∣∣∣∣012011011∣∣∣∣∣∣n
因此通过矩阵快速幂求得dp[n]dp[n]dp[n]的值,再根据nnn的奇偶分类讨论即可。
ps:需特判一下nnn为0的情况
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
struct node
{ll arr[3][3];node() {ms(arr);}
};
ll p;
node mul(node a,node b) {node c;for(int i=0;i<3;i++) {for(int j=0;j<3;j++) {for(int k=0;k<3;k++) {c.arr[i][j]=(c.arr[i][j]+(a.arr[i][k]*b.arr[k][j])%p)%p;}}}return c;
}
ll quickpow(ll n) {node a,b;a.arr[0][0]=a.arr[0][1]=a.arr[0][2]=a.arr[2][2]=0;a.arr[1][0]=a.arr[1][1]=a.arr[1][2]=a.arr[2][1]=1;a.arr[2][0]=2;b.arr[0][0]=b.arr[0][1]=1;b.arr[0][2]=b.arr[1][0]=b.arr[1][1]=b.arr[1][2]=0;b.arr[2][0]=b.arr[2][1]=b.arr[2][2]=0;while(n) {if(n&1) b=mul(b,a);a=mul(a,a);n>>=1;}return b.arr[0][0]%p;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);//ios::sync_with_stdio(0),cin.tie(0);ll n;scanf("%lld %lld",&n,&p);ll ans=quickpow(n);if(n==0) printf("%lld\n",1%p);else {if(n%2==1) printf("%lld\n",ans);else {printf("%lld\n",(ans-1+p)%p);}}return 0;
}