首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来


#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll N = 1e2 + 10;
const ll Mod = 998244353; ll add(ll a, ll b, ll mod = Mod) {
return (a += b) >= mod ? a - mod : a;
} ll sub(ll a, ll b, ll mod = Mod) {
return (a -= b) < 0 ? a + mod : a;
} ll mul(ll a, ll b, ll mod = Mod) {
return 1ll * a * b % mod;
} ll fast_pow(ll a, ll b, ll mod = Mod) {
ll res = 1;
for (; b; b >>= 1, a = mul(a, a, mod))
if (b & 1) res = mul(res, a, mod);
return res;
} ll n, m, k, b[N]; struct Matrix {
ll g[N][N]; Matrix() {
memset(g, 0, sizeof(g));
}
}; Matrix operator * (const Matrix a, const Matrix b) {
Matrix c;
for (ll i = 1; i <= k; i++)
for (ll j = 1; j <= k; j++)
for (ll p = 1; p <= k; p++)
c.g[i][j] = add(c.g[i][j], mul(a.g[i][p], b.g[p][j], Mod - 1), Mod - 1);
return c;
} Matrix fast_pow(Matrix a, ll b) {
Matrix res;
for (ll i = 1; i <= k; i++)
res.g[i][i] = 1;
for (; b; b >>= 1, a = a * a)
if (b & 1) res = res * a;
return res;
} ll bsgs(ll a, ll b) {
map<ll, ll> mp;
mp[b] = 0;
ll cur = 1, limit = sqrt(Mod);
for (ll i = 1; i <= limit; i++) {
cur = mul(cur, a);
mp[mul(b, fast_pow(cur, Mod - 2))] = i;
}
ll now = 1;
for (ll i = 0; i <= limit; i++) {
if (mp.count(now))
return limit * i + mp[now];
now = mul(now, cur);
}
return -1;
} ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
} void exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
} ll exgcd(ll a, ll b, ll c) {
ll g = gcd(a, b);
if (c % g) return -1;
ll x, y;
exgcd(a, b, x, y);
x *= c / g;
x = (x % (b / g) + (b / g)) % (b / g);
return x;
} int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
#endif
scanf("%lld", &k);
for (ll i = 1; i <= k; i++)
scanf("%lld", &b[i]);
scanf("%lld %lld", &n, &m);
Matrix tmp;
for (ll i = 1; i < k; i++)
tmp.g[i][i + 1] = 1;
for (ll i = 1; i <= k; i++)
tmp.g[k][i] = b[k - i + 1];
tmp = fast_pow(tmp, n - k);
ll ans1 = bsgs(3, m), ans2 = exgcd(tmp.g[k][k], Mod - 1, ans1);
if (ans1 == -1 || ans2 == -1)
printf("-1");
else
printf("%lld", fast_pow(3, ans2));
return 0;
}

Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】的更多相关文章

  1. 2018.08.30 NOIP模拟 kfib(矩阵快速幂+exgcd)

    [输入] 一行两个整数 n P [输出] 从小到大输出可能的 k,若不存在,输出 None [样例输入 1] 5 5 [样例输出] 2 [样例解释] f[0] = 2 f[1] = 2 f[2] = ...

  2. bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希

    题目 给定矩阵A, B和模数p,求最小的正整数x满足 A^x = B(mod p). 分析 与整数的离散对数类似,只不过普通乘法换乘了矩阵乘法. 由于矩阵的求逆麻烦,使用 $A^{km-t} = B( ...

  3. 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)

    昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ...

  4. HDU4887_Endless Punishment_BSGS+矩阵快速幂+哈希表

    2014多校第一题,当时几百个人交没人过,我也暴力交了几发,果然不行. 比完了去学习了BSGS才懂! 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4887 ...

  5. Codeforces Round #536 (Div. 2) F 矩阵快速幂 + bsgs(新坑) + exgcd(新坑) + 欧拉降幂

    https://codeforces.com/contest/1106/problem/F 题意 数列公式为\(f_i=(f^{b_1}_{i-1}*f^{b_2}_{i-2}*...*f^{b_k} ...

  6. CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)

    题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...

  7. CF1106F Lunar New Year and a Recursive Sequence 原根、矩阵快速幂、BSGS

    传送门 好久没写数论题了写一次调了1h 首先发现递推式是一个乘方的形式,线性递推和矩阵快速幂似乎都做不了,那么是否能够把乘方运算变成加法运算和乘法运算呢? 使用原根!学过\(NTT\)的都知道\(99 ...

  8. CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&&bsgs

    题意 设 $$f_i = \left\{\begin{matrix}1 , \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  i < k\\ ...

  9. 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...

随机推荐

  1. js 中面向对象的多态

    什么是多态: 实际上是不同对象作用与同一操作产生不同的效果.多态的思想实际上是把“想做什么”和“谁去做“分开,多态的好处是什么呢?为什么要多态?我们来看看 Martin Fowler 在<重构: ...

  2. MyBatis3-基于注解的示例

    在基于注解的示例中,可以简化编写XML的过程,全部采用注解方式进行编写,并在注解上写SQL语句,语句和XML的语句保持一致,并且可以省略掉XML文件不用引入的好处.但还有一点,基于注解的方式还没有百分 ...

  3. 卸载 PrestaShop 1.7

    PrestaShop 的卸载非常简单: 在你的 Web 服务器上删除所有 PrestaShop 的文件和目录.你可以使用 FTP 客户端,你也可以使用 SSH 工具. 使用数据库工具删除数据库中所有以 ...

  4. Confluence 6 获得 Active Directory 服务器证书

    上面的步骤说明了如何在你的 Microsoft Active Directory服务器上安装 certification authority (CA).这一步,你需要为你的 Microsoft Act ...

  5. SQL Server数据库 优化查询速度

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...

  6. Activiti工作流笔记(3)

    Activiti工作流的流程部署和删除流程部署 流程部署代码: /** * 部署流程 */ public class ActivitiTest { RepositoryService reposito ...

  7. jstl <fmt:formatNumber>标签

    标签用于格式化数字,百分比和货币. 如果type属性为百分比或数字,则可以使用多个数字格式属性.maxIntegerDigits和minIntegerDigits属性允许您指定数字的非分数部分的大小. ...

  8. html <frame>标签使用

    标签定义 frameset 中的一个特定的窗口(框架) frameset中的每个框架都可以设置不同的属性,比如border,scrolling,noresize等 frame的常用属性 width: ...

  9. learning uboot how to set ddr parameter in qca4531 cpu

    DDR工作频率  在600MHZ. include/configs/board953x.h #define CFG_PLL_FREQ            CFG_PLL_650_600_200 #d ...

  10. 数据库schema的简介

    [参考]自百度百科 数据库中的Schema,为数据库对象的集合,一个用户一般对应一个schema. 官方定义如下: A schema is a collection of database objec ...