【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 (高斯消元)
三个题放在一起写了 主要是搞搞模板 在这里简述一下怎么写高斯消元 就和代数里学的加减消元学的一样 把矩阵化为上三角形形式 然后进行回代 同时枚举当前要消元的未知数和当前化简到哪一行了 然后从这一行往后 ...
随机推荐
- URL中包含url参数,(文件路径作为参数)
用encodeURIComponent方法,把路径放在里面,可以防止斜杠被取消. 以下attachfiles是我的一个文件的绝对路径. window.location.href="${pag ...
- 使用synchronized的几种场景
1.修饰一个方法synchronized 修饰一个方法很简单,就是在方法的前面加synchronized,例如: public synchronized void method() { // todo ...
- Kotlin入门(31)JSON字符串的解析
json是App进行网络通信最常见的数据交互格式,Android也自带了json格式的处理工具包org.json,该工具包主要提供了JSONObject(json对象)与JSONArray(json数 ...
- Linux 环境 Intelij Idea 安装与快捷图标配置
索引: 目录索引 参看代码 GitHub: intelij-idea.txt 一.Linux (DeepinOS) 环境 1.官网下载 ideaIU-.tar.gz 2.解压 .tar.gz -C ~ ...
- 在coding或者github建立个人站点域名绑定
coding:静态的在域名服务器与是填写pages.coding.me,不是填写{你的名字}.coding.me A型的ip是ping 该域名ip github:上传大项目可能报错(报错名字忘记了), ...
- selenium-配置文件定位元素(九)
原文链接:https://mp.weixin.qq.com/s?__biz=MzU5NTgyMTE3Mg==&mid=2247483802&idx=1&sn=3218e34b6 ...
- MFC拖拽、选择目录、遍历文件
1.选择目录 void CDecryptFileDlg::OnBnClickedSel() { std::wstring selectedDir; WCHAR szDir[MAX_PATH]; Zer ...
- 二叉搜索树的最近公共祖先的golang实现
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...
- SQL NOT NULL 约束
SQL NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值. NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记录. 下面的 SQ ...
- Android测试(四):Instrumented 单元测试
原文:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html Instrume ...