首页 > 其他分享 >P1707 刷题比赛 题解

P1707 刷题比赛 题解

时间:2023-06-12 14:35:37浏览次数:41  
标签:11 begin end P1707 题解 times bmatrix &+ 刷题

多少有点混乱邪恶。

题意:给出递推式:

\[a_1=b_1=c_1=1\\ a_2=b_2=c_2=3\\ \begin{aligned} a_k&=p\times a_{k-1}+q\times a_{k-2}&+b_{k-1}+c_{k-1}&+r(k-2)^2+t(k-2)+1\\ b_k&=u\times b_{k-1}+v\times b_{k-2}&+a_{k-1}+c_{k-1}&+w^{k-2}\\ c_k&=x\times c_{k-1}+y\times c_{k-2}&+a_{k-1}+b_{k-1}&+z^{k-2}+k \end{aligned} \]

求 \(a_n,b_n,c_n\) 模 \(m\) 的值

\(4\le n\le 10^{16},2\le m\le 10^{16}\),其他数据 \(\le 100\)

思路:

先把递推式改写成 \(a_{k+1}=\cdots\) 的形式:

\[\begin{aligned} a_{k+1}&=p\times a_k+q\times a_{k-1}&+b_{k}+c_{k}&+r(k-1)^2+t(k-1)+1\\ b_{k+1}&=u\times b_{k}+v\times b_{k-1}&+a_{k}+c_{k}&+w^{k-1}\\ c_{k+1}&=x\times c_{k}+y\times c_{k-1}&+a_{k}+b_{k}&+z^{k-1}+k+1 \end{aligned} \]

考虑维护 \(a_k,a_{k-1},b_k,b_{k-1},c_k,c_{k-1},(k-1)^2,k-1,w^{k-1},z^{k-1},1\),有递推式:

\[\begin{bmatrix} p & q & 1 & 0 & 1 & 0 & r & t & 0 & 0 & 1\\ 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 1 & 0 & u & v & 1 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 1 & 0 & 1 & 0 & x & y & 0 & 1 & 0 & 1 & 2\\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 2 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & w & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & z & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} a_k\\ a_{k-1}\\ b_k\\ b_{k-1}\\ c_k\\ c_{k-1}\\ (k-1)^2\\ k-1\\ w^{k-1}\\ z^{k-1}\\ 1 \end{bmatrix}=\begin{bmatrix} a_{k+1}\\ a_{k}\\ b_{k+1}\\ b_{k}\\ c_{k+1}\\ c_{k}\\ k^2\\ k\\ w^{k}\\ z^{k}\\ 1 \end{bmatrix} \]

然后就做完了,答案即为

\[\begin{bmatrix} p & q & 1 & 0 & 1 & 0 & r & t & 0 & 0 & 1\\ 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 1 & 0 & u & v & 1 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 1 & 0 & 1 & 0 & x & y & 0 & 1 & 0 & 1 & 2\\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 2 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & w & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & z & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix}^{n-2} \begin{bmatrix} 3\\ 1\\ 3\\ 1\\ 3\\ 1\\ 1\\ 1\\ w\\ z\\ 1 \end{bmatrix}=\begin{bmatrix} a_n\\ a_{n-1}\\ b_n\\ b_{n-1}\\ c_n\\ c_{n-1}\\ (n-1)^2\\ n-1\\ w^{n-1}\\ z^{n-1}\\ 1 \end{bmatrix} \]

#include <iostream>

using namespace std;
using LL = long long;
using i128 = __int128_t;

template <int kN, int kM>
struct M {
  i128 a[kN + 1][kM + 1];

  M() { fill(a[0], a[kN + 1], 0); }
};
LL n, m;
int p, q, r, t, u, v, w, x, y, z;

template <int kNa, int kMa, int kMb>
const M<kNa, kMb> operator*(const M<kNa, kMa> &x, const M<kMa, kMb> &y) {
  M<kNa, kMb> s;
  for (int i = 1; i <= kNa; ++i) {
    for (int k = 1; k <= kMa; ++k) {
      for (int j = 1; j <= kMb; ++j) {
        s.a[i][j] += x.a[i][k] * y.a[k][j];
      }
    }
  }
  for (int i = 1; i <= kNa; ++i) {
    for (int j = 1; j <= kMb; ++j) {
      s.a[i][j] %= m;
    }
  }
  return s;
}
template <int kN>
M<kN, kN> P(M<kN, kN> b, LL e) {
  M<kN, kN> s;
  for (int i = 1; i <= kN; ++i) {
    s.a[i][i] = 1;
  }
  for (; e; e >>= 1, b = b * b) {
    if (e & 1) {
      s = s * b;
    }
  }
  return s;
}
M<11, 11> b;
M<11, 1> s;

int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m;
  cin >> p >> q >> r >> t;
  cin >> u >> v >> w;
  cin >> x >> y >> z;
  b.a[1][1] = p, b.a[1][2] = q, b.a[1][3] = b.a[1][5] = b.a[2][1] = 1;
  b.a[1][7] = r, b.a[1][8] = t, b.a[1][11] = 1;
  b.a[3][3] = u, b.a[3][4] = v, b.a[3][1] = b.a[3][5] = b.a[4][3] = 1;
  b.a[3][9] = 1;
  b.a[5][5] = x, b.a[5][6] = y, b.a[5][1] = b.a[5][3] = b.a[6][5] = 1;
  b.a[5][8] = b.a[5][10] = 1, b.a[5][11] = 2;
  b.a[7][7] = 1, b.a[7][8] = 2, b.a[7][11] = 1;
  b.a[8][8] = 1, b.a[8][11] = 1;
  b.a[9][9] = w, b.a[10][10] = z, b.a[11][11] = 1;
  s.a[1][1] = s.a[3][1] = s.a[5][1] = 3;
  s.a[2][1] = s.a[4][1] = s.a[6][1] = 1;
  s.a[7][1] = s.a[8][1] = 1;
  s.a[9][1] = w, s.a[10][1] = z, s.a[11][1] = 1;
  M<11, 1> r = P(b, n - 2) * s;
  cout << "nodgd " << LL(r.a[1][1]) << '\n';
  cout << "Ciocio " << LL(r.a[3][1]) << '\n';
  cout << "Nicole " << LL(r.a[5][1]);
  return 0;
}

标签:11,begin,end,P1707,题解,times,bmatrix,&+,刷题
From: https://www.cnblogs.com/bykem/p/17474923.html

相关文章

  • java刷题网站最近更新的面试题
    49个人中至少几个人生日是同一月?如何用3升和5升桶量取4升水?JVM逃逸分析默认是开启还是关闭?ZGC有缺点吗?JVM对Java的原生锁做了哪些优化?为什么wait(),notify()和notifyAll()必须在同步方法或者同步块中被调用?什么是锁消除和锁粗化?为什么代码会重排序?什么是自旋?你们线程池是怎......
  • P1306 斐波那契公约数 题解
    请求出\(f_n\)与\(f_m\)的最大公约数,即\(\gcd(f_n,f_m)\),答案对\(10^8\)取模。结论:\(\gcd(f_n,f_m)=f_{\gcd(n,m)}\)证明如下:首先引理1:\[f_{n+m}=f_{n-1}\timesf_{m}+f_{n}\timesf_{m+1}\]运用归纳法,可以简单证明,此处略去。引理2:\[\gcd(f_n,f_......
  • AtCoder Beginner Contest 305 题解
    https://atcoder.jp/contests/abc305/tasks_printE-ArtGalleryonGraph冷知识:md这题赛时没做出来/cy刚看到题:这是什么题啊,\(K,h\)都\(1e5\)能做吗/fn确实能做。考虑类似SPFA的操作。设\(a_x\)表示\(x\)还可以对距离最多为\(a_x\)的点产生贡献,然后就直接......
  • Codeforces Round 876 Div2 A-D题解
    CodeforcesRound876Div2A-D题解A.TheGoodArray这个题就是问你对于\(i\leqn\),要求前面后面至少\(ceil(\frac{i}{k})\)个1那我们就贪心的每k个放一个1,或者直接用数学算一下就好了AC代码#include<bits/stdc++.h>usingnamespacestd;constexprintlimit=(......
  • Java8新特性Stream之list转map及问题解决
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap具体用法实例如下://声明一个List集合Listlist=newArrayList();list.add(newPerson("1001","小A"));list.add(newPerson("1002","小B"));list.add(......
  • 杂题题解
    序列变化(exchange)只要第一位确定,后面的\(n-1\)位都是唯一确定的。因为具体是B还是C只取决于两侧字母是否一样,所以两种变化方案其中一种是另一种每一位取反,要么都合法,要么都不合法。但变化出的方案可能不能继续变化下去,比如CCC变化到BBB之后就不能再变化了,但变化到CCC......
  • permu题解(树上莫队)(非正解)
    题目传送门题意给出一个长度为$n$的排列$P(P1,P2,...Pn)$,以及$m$个询问。每次询问某个区间$[l,r]$中,最长的值域连续段长度。思路首先这道题事求连续段的长度,打个莫队先#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;namespaceTestify{ inlineint......
  • mysql运行sql文件时,timestamp默认值出错问题解决
    出现了---Invaliddefaultvaluefor'reward_time' 直接打开sql文件,将字段reward_time类型值替换成NULL即可 ......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后......
  • 算法刷题记录:P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
    题目链接:https://www.luogu.com.cn/problem/P1518题目分析这道模拟题很典型了,给定了一个固定的移动方式,去模拟即可,该题说:如果牛和农夫永远不会相遇输出0,我没想到很好的方法,不推荐我这样的写法。算勉强AC吧。AC代码//Problem:P1518[USACO2.4]两只塔姆沃斯牛TheTamwort......