首先矩阵快速幂可以算出来第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. 基于Redis分布式锁(获取锁及解锁)

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可用性( ...

  2. Redis<六> Key通用操作

    1). KEYS pattern : 查找所有符合给定模式 pattern 的 key . 如 keys * , keys *list* 2). DEL key [key ...] : 删除给定的一个 ...

  3. ArcGIS API for Silverlight 的重要内容******重要

    ArcGIS Silverlight API:是构建在微软Silverlight平台之上,通过ArcGIS Server Rest API消费ArcGIS Server 服务,同时支持直接消费Bing ...

  4. sgu 116 Index of super-prime

    题意:用最少的super-prime组成n; 找出所有的super-prime数,只有202个.用完全背包记录能取到n值的最少数量.再找出7要哪些元素. #include <iostream&g ...

  5. Android设置全局Context

    新建一个java继承Application类 import android.app.Application; import android.content.Context; /** * 编写自定义Ap ...

  6. IDEA设置类、方法注释模板

    类注释模板 File -> Other Setting -> Default Setting打开默认设置 Editor -> File and Code Templates -> ...

  7. Nastya and King-Shamans CodeForces - 992E (线段树二分)

    大意: 给定序列a, 单点更新, 询问是否存在a[i]等于s[i-1], s为a的前缀和, a非负 考虑到前缀和的单调性, 枚举从1开始前缀和, 找到第一个大于等于s[1]的a[i], 如果相等直接输 ...

  8. centos 7安装vmtools时提示The path "" is not a valid path to the xxx kernel headers.

    解决办法: yum -y install kernel-headers kernel-devel gcc reboot

  9. km板子(二分图最大权匹配)

    //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack- ...

  10. 牛客网——B-栈和排序

    链接:https://www.nowcoder.com/acm/contest/58/B来源:牛客网 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组 ...