【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 (高斯消元)
三个题放在一起写了 主要是搞搞模板 在这里简述一下怎么写高斯消元 就和代数里学的加减消元学的一样 把矩阵化为上三角形形式 然后进行回代 同时枚举当前要消元的未知数和当前化简到哪一行了 然后从这一行往后 ...
随机推荐
- AngularJS处理服务器端返回的JSON数据的格式问题
用ng的$http服务发起ajax请求,php返回的JSON数据格式要正确! 一开始我的php页面是这样返回数据的: if($result){ $oid = mysqli_insert_id($con ...
- linux下sophos,clamav+clamtk杀毒软件
以deepin为例 avast for linux sophos for linux comodo for linux 目前能够在官网找到. 先说clamav clamav 听说很活跃,clamav是 ...
- 前后端分离djangorestframework—— 接入微信模板消息推送
微信 什么是微信也不多说,跟前面的支付宝一样的 微信支付 微信支付也有个沙箱环境,沙箱环境官方文档 由文档中那句很显眼的话所得,即使是测试环境也需要真实的商户号,所以这个就没法想支付宝那样用沙箱账号来 ...
- python开发规范和(configparser、random模块)
目录结构: bin:存放程序入口,程序启动文件. conf:存放配置文件,配置文件主要是一些全局变量,路径信息等. core:程序核心文件,不涉及到业务逻辑. app:存放和系统业务相关的逻辑. db ...
- 【原】Java学习笔记016 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // this 关键字 ...
- 【PAT】B1013 数素数
用埃氏筛筛出素数表(节约时间) 素数的筛选范围不能小了,一定要够大 #include<stdio.h> int main(){ int N,M;scanf("%d %d" ...
- logback.xml的使用,将日志异步保存到数据库中
想要把日志异步保存到数据库中,首先需要创建一个数据库,然后创建三张固定的表: https://github.com/xiaorenwu-dashijie/logback.git <?xml ve ...
- Django【跨域】
jsonp 方式一:指定返回方法 # 后端 def view(request): callback = request.GET.get('callback') return HttpResponse( ...
- How Cigna Tuned Its Spark Streaming App for Real-time Processing with Apache Kafka
Explore the configuration changes that Cigna’s Big Data Analytics team has made to optimize the perf ...
- SQL 约束 (Constraints)
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...