【XSY3154】入门多项式 高斯消元
题目大意
给你一个 \(n\times n\)的矩阵 \(A\),求次数最小且最高次项为 \(1\) 的多项式 \(F(x)\),满足 \(F(A)=0\)。
所有操作都对 \(p\) 取模。
\(n\leq 70,n<p\leq 998244353\)
题解
显然特征多项式满足条件,但不一定是最优的。
设答案为 \(F(x)=\sum_{i\geq 0}f_ix^i\)。
那么
f_0{(A^0)}_{1,1}+f_1{(A^1)}_{1,1}+\cdots+f_n{(A^n)}_{1,1}&=0\\
f_0{(A^0)}_{1,2}+f_1{(A^1)}_{1,2}+\cdots+f_n{(A^n)}_{1,2}&=0\\
\vdots\\
f_0{(A^0)}_{n,n}+f_1{(A^1)}_{n,n}+\cdots+f_n{(A^n)}_{n,n}&=0
\end{cases}
\]
这就是一个方程组,可以通过高斯消元来求解。
观察高斯消元的过程。
如果在消第 \(i\) 列的时候找不到主元,就说明这个矩阵的前 \(i\) 列不满秩,那么就可以钦定 \(f_{i-1}=1\),从而得到一组解。
否则前 \(i\) 列是满秩的,唯一可能的解为 \(f_0=f_1=\ldots=f_{i-1}=0\)
时间复杂度:\(O(n^4)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=80;
int n;
ll p;
ll fp(ll a,ll b)
{
ll s=1;
for(;b;b>>=1,a=a*a%p)
if(b&1)
s=s*a%p;
return s;
}
struct mat
{
ll a[N][N];
mat()
{
memset(a,0,sizeof a);
}
ll *operator [](int x)
{
return a[x];
}
};
mat operator *(mat a,mat b)
{
mat c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
__int128 s=0;
for(int k=1;k<=n;k++)
s+=(ll)a[i][k]*b[k][j];
c[i][j]=s%p;
}
return c;
}
mat a[N];
ll ans[N];
ll c[N*N][N];
int m;
void gao(int x)
{
ans[x]=1;
for(int i=1;i<x;i++)
ans[i]=(-c[i][x]*fp(c[i][i],p-2)%p+p)%p;
printf("%d\n",x-1);
for(int i=1;i<=x;i++)
printf("%lld ",ans[i]);
}
void gao()
{
for(int i=1;i<=n+1;i++)
{
int flag=0;
for(int j=i;j<=m;j++)
if(c[j][i])
{
flag=j;
break;
}
if(!flag)
{
gao(i);
return;
}
if(flag!=i)
{
for(int k=i;k<=n+1;k++)
swap(c[i][k],c[flag][k]);
}
ll inv=fp(c[i][i],p-2);
for(int j=1;j<=m;j++)
if(j!=i&&c[j][i])
{
ll v=c[j][i]*inv%p;
for(int k=i;k<=n+1;k++)
c[j][k]=(c[j][k]-v*c[i][k])%p;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
scanf("%d%lld",&n,&p);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a[1][i][j]);
for(int i=1;i<=n;i++)
a[0][i][i]=1;
for(int i=2;i<=n;i++)
a[i]=a[i-1]*a[1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
m++;
for(int k=0;k<=n;k++)
c[m][k+1]=a[k][i][j];
}
gao();
return 0;
}
【XSY3154】入门多项式 高斯消元的更多相关文章
- 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185
最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...
- UVALive - 6185 Find the Outlier暴力填表+高斯消元+卡eps
https://cn.vjudge.net/problem/UVALive-6185 我真的是服了orz eps 1e5,1e6过不了 开1e2 1e1都能过 题意:给你一个d阶多项式f的f(0),f ...
- BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...
- 【BZOJ2137】submultiple 高斯消元求伯努利数
[BZOJ2137]submultiple Description 设函数g(N)表示N的约数个数.现在给出一个数M,求出所有M的约数x的g(x)的K次方和. Input 第一行输入N,K.N表示M由 ...
- BZOJ4689 Find the Outlier 【高斯消元】*
BZOJ4689 Find the Outlier Description Abacus教授刚刚完成了一个制作数表的计算引擎的设计.它被设计用于同时计算一个多项式在许多点的取值.例如对于多项式 f(x ...
- 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元
Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...
- SPOJ HIGH(生成树计数,高斯消元求行列式)
HIGH - Highways no tags In some countries building highways takes a lot of time... Maybe that's bec ...
- [bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]
题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^ ...
- BZOJ1013 + BZOJ1923 + POJ1830 (高斯消元)
三个题放在一起写了 主要是搞搞模板 在这里简述一下怎么写高斯消元 就和代数里学的加减消元学的一样 把矩阵化为上三角形形式 然后进行回代 同时枚举当前要消元的未知数和当前化简到哪一行了 然后从这一行往后 ...
随机推荐
- 华为有AI,这场转型战有点大
华为有AI,这场转型战有点大 https://mp.weixin.qq.com/s/qnUP5cgbNxXcAT82NQARtA 李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为有AI ...
- Windows7 64位环境6sv2.1大气传输模型修改源码添加国产高分卫星GF-1 GF-2光谱响应支持
下面开始添加国产卫星光谱响应的支持: 以下主要参考文章“6S大气传输模型修改源码添加.自定义卫星光谱响应(以HJ-1B CCD为例)”网址:http://blog.csdn.net/sam92/art ...
- vue.js的手脚架vue-cli项目搭建的步骤
手脚架是什么? 众所周知,现在的前端项目发展得越渐越大,我们前端程序员要从0开始去搭建一套完整的项目很费时,所以这时候前端工程的手脚架就出现了. 我用得vue-cli也是其中之一,还有其他的我也说不清 ...
- 获取spring security用户相关信息
在JSP中获得 使用spring security的标签库 在页面中引入标签 <%@ taglib prefix="sec" uri="http://www.spr ...
- Redis持久化的方式
Redis小知识: redis是键值对的数据库,有5中主要数据类型: 字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) Redis持 ...
- Cs231n课堂内容记录-Lecture 8 深度学习框架
Lecture 8 Deep Learning Software 课堂笔记参见:https://blog.csdn.net/u012554092/article/details/78159316 今 ...
- 我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
我的博客即将入驻"云栖社区",诚邀技术同仁一同入驻. 博客搬家邀请码NXLZV
- Linux经常用到的命令以及快捷键
Linux常用命令和快捷键 最近一直在对CentOS系统进行各种体验,为方便自己也方便他人,整理了Linux常用命令及快捷键,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样. Linu ...
- LinuxMint上安装redis和python遇到的一些问题
今天在安装Redis和Python上遇到了些问题,解决后记录下来. 环境:LinuxMint 18.3 安装redis sudo wget http://download.redis.io/relea ...
- bootstrapt 使用遇到问题
1.布局的时候什么时候用xs,sm,md,lg? small grid (≥ 768px) = .col-sm-*, medium grid (≥ 992px) = .col-md-*, large ...