首先矩阵快速幂可以算出来第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. Codeforces 834C - The Meaningless Game

    834C - The Meaningless Game 数学. 思路1:判断a•b能不能化成v3且a%v==0且b%v==0.v可以直接用pow求(或者用cbrt),也可以二分求:还可以用map映射预 ...

  2. 机器学习 Numpy库入门

    2017-06-28 13:56:25 Numpy 提供了一个强大的N维数组对象ndarray,提供了线性代数,傅里叶变换和随机数生成等的基本功能,可以说Numpy是Scipy,Pandas等科学计算 ...

  3. ASCII 可打印字符与控制字符

    2017-08-16 21:29:30 基本的 ASCII 字符集共有 128 个字符,其中有 95 个可打印字符,包括常用的字母.数字.标点符号等,另外还有 33 个控制字符.标准 ASCII 码使 ...

  4. Linux下搜索文件

    使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索.搜索文件的命令为"find":"locate":"whereis& ...

  5. ps命令各个内容信息详解

        USER    用户名  PID    进程ID(Process ID)  %CPU    进程的cpu占用率  %MEM    进程的内存占用率  VSZ    进程所使用的虚存的大小(Vi ...

  6. JavaScript的深拷贝和浅拷贝总结

    深拷贝和浅拷贝 深拷贝:拷贝实例:浅拷贝:拷贝引用(原对象). 说深拷贝和浅拷贝之前,我先去了解了下高程书上的JavaScript的变量类型: 基本类型:undefined.null.Boolean. ...

  7. bzoj2595: [Wc2008]游览计划 斯坦纳树

    斯坦纳树是在一个图中选取某些特定点使其联通(可以选取额外的点),要求花费最小,最小生成树是斯坦纳树的一种特殊情况 我们用dp[i][j]来表示以i为根,和j状态是否和i联通,那么有 转移方程: dp[ ...

  8. mxnet(gluon) 实现DQN简单小例子

    参考文献 莫凡系列课程视频 增强学习入门之Q-Learning 关于增强学习的基本知识可以参考第二个链接,讲的挺有意思的.DQN的东西可以看第一个链接相关视频.课程中实现了Tensorflow和pyt ...

  9. EBS Workflow参考资料

    参考资料: How to send an email from oracle workflow process using an AdHocRole? Notification System APIs ...

  10. 根据服务端生成的WSDL文件创建客户端支持代码的三种方式

    第一种:使用wsimport是JDK自带的工具,来生成 生成java客户端代码常使用的命令参数说明: 参数 说明 -p 定义客户端生成类的包名称 -s 指定客户端执行类的源文件存放目录 -d 指定客户 ...