【洛谷 P1707】 刷题比赛 (矩阵加速)
题目连接
很久没写矩阵加速了,复习一下,没想到是一道小毒瘤题。
状态矩阵\(a[k],b[k],c[k],a[k+1],b[k+1],c[k+1],k,k^2,w^k,z^k,1\)
转移矩阵
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, q, 0, 0, p, 1, 1, t, r, 0, 0, 1,
0, 0, v, 0, 1, u, 1, 0, 0, 1, 0, 0,
0, 0, 0, y, 1, 1, x, 1, 0, 0, 1, 2,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, w, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, z, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
手写不易。
#include <cstdio>
#include <cstdlib>
#include <cstring>
// a[k],b[k],c[k],a[k+1],b[k+1],c[k+1],k,k^2,w^k,z^k,1
int u, v, p, q, r, t, x, w, z, y;
typedef long long ll;
ll n, k;
ll f[12], tmp[12], temp[12][12], dp[12][12];
inline ll Slow_Mul(ll a, ll b){
ll ans = 0;
while(b){
if(b & 1) ans = (ans + a) % k;
b >>= 1;
a = (a + a) % k;
}
return ans;
}
inline void Mult(){
for(int i = 1; i <= 11; ++i){
tmp[i] = 0;
for(int j = 1; j <= 11; ++j)
(tmp[i] += Slow_Mul(f[j], dp[i][j])) %= k;
}
for(int i = 1; i <= 11; ++i)
f[i] = tmp[i];
}
inline void Self(){
for(int i = 1; i <= 11; ++i)
for(int j = 1; j <= 11; ++j){
temp[i][j] = 0;
for(int l = 1; l <= 11; ++l)
(temp[i][j] += Slow_Mul(dp[i][l], dp[l][j])) %= k;
}
for(int i = 1; i <= 11; ++i)
for(int j = 1; j <= 11; ++j)
dp[i][j] = temp[i][j];
}
inline void Fast_Pow(){
n -= 2;
while(n){
if(n & 1) Mult();
n >>= 1;
Self();
}
}
int main(){
scanf("%lld%lld%d%d%d%d%d%d%d%d%d%d", &n, &k, &p, &q, &r, &t, &u, &v, &w, &x, &y, &z);
ll xs[12][12] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, q, 0, 0, p, 1, 1, t, r, 0, 0, 1,
0, 0, v, 0, 1, u, 1, 0, 0, 1, 0, 0,
0, 0, 0, y, 1, 1, x, 1, 0, 0, 1, 2,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, w, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, z, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
};
memcpy(dp, xs, sizeof dp);
f[1] = f[2] = f[3] = f[11] = 1; f[4] = f[5] = f[6] = 3; f[9] = w; f[10] = z; f[7] = 1; f[8] = 1;
Fast_Pow();
printf("nodgd %lld\nCiocio %lld\nNicole %lld\n", f[4], f[5], f[6]);
return 0;
}
【洛谷 P1707】 刷题比赛 (矩阵加速)的更多相关文章
- [洛谷P1707] 刷题比赛
洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...
- P1707 刷题比赛
P1707 刷题比赛 10通过 38提交 题目提供者nodgd 标签倍增递推矩阵洛谷原创 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不科学 题目背景 nodgd是一个喜欢写程序的同学, ...
- 洛谷 P1167 刷题
洛谷 P1167 刷题 洛谷传送门 题目描述 noip临近了,小A却发现他已经不会写题了.好在现在离竞赛还有一段时间,小A决定从现在开始夜以继日地刷题.也就是说小A废寝忘食,一天二十四小时地刷题. 今 ...
- [洛谷P1939]【模板】矩阵加速(数列)
题目大意:给你一个数列a,规定$a[1]=a[2]=a[3]=1$,$a[i]=a[i-1]+a[i-3](i>3)$求$a[n]\ mod\ 10^9+7$的值. 解题思路:这题看似是很简单的 ...
- 洛谷 P1939 【模板】矩阵加速(数列) 解题报告
P1939 [模板]矩阵加速(数列) 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值 ...
- 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...
- [luogu1707] 刷题比赛 [矩阵快速幂]
题面: 传送门 思路: 一眼看上去是三个递推......好像还挺麻烦的 仔细观察一下,发现也就是一个线性递推,但是其中后面的常数项比较麻烦 观察一下,这里面有以下三个递推是比较麻烦的 第一个是$k^2 ...
- 洛谷 P1939 【模板】矩阵加速(数列)
题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入输出格式 输入格式: 第一行一 ...
- 洛谷P1939【模板】矩阵加速(数列)+矩阵快速幂
思路: 这个 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 可以想成: [a(n) ] [1 0 1] [a(n-1) ] [a(n-1) ] = ...
- 洛谷P5274 优化题(ccj)
洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...
随机推荐
- FromHandle临时对象一探究竟
我们在调用CWnd::GetDlgItem()函数时,MSDN告诉我们:The returned pointer may be temporary and should not be stored f ...
- cf1073d Berland Fair
~~~题面~~~ 题解: 可以发现,每走完一圈付的钱和买的数量是有周期性的,即如果没有因为缺钱而买不起某家店的东西,那么这一圈的所以决策将会和上一圈相同,这个应该是很好理解的,想想就好了. 因为钱数固 ...
- bzoj3709: [PA2014]Bohater 贪心
~~~题面~~~ 题解: 首先有一个比较明显的策略,肯定先要把能带给自己受益的先选完,然后再以最佳状态去打那些会给自己带来损失的怪. 对于前一部分(可以带来受益的怪),显然我们需要先从代价小的打起,因 ...
- BZOJ4198 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://www.luogu.org/problemnew/show/P2168 ht ...
- BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ...
- URAL1297:Palindrome——题解
http://acm.timus.ru/problem.aspx?space=1&num=1297 https://vjudge.net/problem/URAL-1297 给定一个字符串,求 ...
- UVA.11464 Even Parity (思维题 开关问题)
UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...
- 差点AFO
差点就AFO了,小伙伴们一定注意护眼啊. 眼睛总算是活过来了. 还有一个月联赛,加油
- bnuoj25660 Two Famous Companies
题目链接:https://www.bnuoj.com/v3/problem_show.php?pid=25660 这个二分真的是烧脑QAQ,想了一晚上才懂了一个大概. 首先,整体思路是二分,直观上感受 ...
- 一个完整的upstart脚本分析
基本概念可以了解 http://www.mike.org.cn/articles/understand-upstart/ http://blog.fens.me/linux-upstart/ http ...