POJ 2065 SETI 高斯消元解线性同余方程
题意:
给出mod的大小,以及一个不大于70长度的字符串。每个字符代表一个数字,且为矩阵的增广列。系数矩阵如下
1^0 * a0 + 1^1 * a1 + ... + 1^(n-1) * an-1 = f(1)
2^0 * a0 + 2^1 * a1 + ... + 2^(n-1) * an-1 = f(2)
........
n^0 * a0 + n^1 * a1 + ... + n^(n-1) * an-1 = f(n)
快速幂取模下系数矩阵
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = 100;
int a[MAXN][MAXN], x[MAXN];
int MOD; void debug(int n, int m)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
printf("%d ", a[i][j]);
printf(" %d\n", a[i][m]);
}
puts("**************************************************************");
} int powermod(int a,int b)
{
int ans=1;
a%=MOD;
while(b)
{
if(b&1) ans=ans*a%MOD;
a=a*a%MOD;
b=b>>1;
}
return ans;
} int gcd(int a,int b) //递归算法
{
return b ? gcd(b, a%b) : a;
} int lcm(int a, int b)
{
return a*b/gcd(a,b);
} int Guass(int equ,int var)
{
// debug(equ, var);
int row,col;
row=col=0;
while(row<equ && col<var)
{
//列非零主
int r=row;
for(int i=row; i<equ; i++)
if(a[i][col]!=0)
{
r=i;
break;
}
if(r!=row)
{
for(int j=col; j<var+1; j++)
swap(a[row][j],a[r][j]);
}
if(a[row][col]==0)//说明有自由变元
{
col++;
continue;
}
//消元
for(int i=row+1; i<equ; i++)
{
if(a[i][col]==0) continue;
int l = lcm(a[row][col],a[i][col]);
int ta = l/a[row][col];
int tb = l/a[i][col];
for(int j=col; j<var+1; j++)
a[i][j] = ((tb*a[i][j] - ta*a[row][j]) % MOD + MOD) %MOD;
}
// debug(equ, var);
row++;
col++;
}
// for(int i=row; i<equ; i++)
// if(a[i][var]!=0) return -1;
// if(row < var) return 1;
for(int i=row-1; i>=0; i--)
{
int tmp = a[i][var];
for(int j=i+1; j<var; j++)
tmp = ((tmp - x[j]*a[i][j])%MOD + MOD)%MOD;
while(tmp%a[i][i]) tmp += MOD;
x[i] = tmp/a[i][i]%MOD;
}
return 0;
} char s[100]; int main()
{
// freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%s", &MOD, s);
int n = strlen(s);
memset(a, 0, sizeof(a));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a[i][j] = powermod(i+1,j);
for(int i=0; i<n; i++)
a[i][n] = s[i]=='*'? 0:s[i]-'a'+1;
Guass(n, n);
for(int i=0; i<n; i++)
{
if(x[i]<0) x[i] += MOD;
printf("%d%c", x[i], i==n-1? '\n':' ');
}
}
return 0;
}
POJ 2065 SETI 高斯消元解线性同余方程的更多相关文章
- poj 2065 SETI 高斯消元
看题就知道要使用高斯消元求解! 代码如下: #include<iostream> #include<algorithm> #include<iomanip> #in ...
- POJ 2065 SETI [高斯消元同余]
题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...
- POJ.2065.SETI(高斯消元 模线性方程组)
题目链接 \(Description\) 求\(A_0,A_1,A_2,\cdots,A_{n-1}\),满足 \[A_0*1^0+A_1*1^1+\ldots+A_{n-1}*1^{n-1}\equ ...
- POJ 2065 SETI (高斯消元 取模)
题目链接 题意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2.... 例如str[] = "abc&quo ...
- POJ 2947-Widget Factory(高斯消元解同余方程式)
题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的 ...
- BZOJ4269再见Xor——高斯消元解线性基
题目描述 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 输入 第一行一个正整数N. 接下来一行N个非负整数. 输出 一行,包含两 ...
- B - SETI POJ - 2065 (高斯消元)
题目链接:https://vjudge.net/contest/276374#problem/B 题目大意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'* ...
- BZOJ 4004: [JLOI2015]装备购买 高斯消元解线性基
BZOJ严重卡精,要加 $long$ $double$ 才能过. 题意:求权和最小的极大线性无关组. 之前那个方法解的线性基都是基于二进制拆位的,这次不行,现在要求一个适用范围更广的方法. 考虑贪心 ...
- poj1830(高斯消元解mod2方程组)
题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...
随机推荐
- 分析Red Hat sosreport输出的方法
分析Red Hat sosreport输出的方法? Modified on: Fri, 31 May 2019 20:20:02 +0800 有一段时间(自EL 4.6以来),Red Hat嵌入了sy ...
- python上下文管理协议,即with的详细使用
一.with obj as f: #代码块... 二.执行流程: 1.with obj --->触发obj.__enter__(),需要在obj里写__enter__(self),在它里边写返回 ...
- Linux利用nc命令脚本批量检测服务器指定端口是否开放
一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...
- Linux 操作系统(二)搜索文件命令find、locate、which、whereis、grep、wc
以下命令均已在 Kali Linux 下验证. 1.find 命令 --1-- find /usr/share -name test.lst //精准搜索,文件名需要与-name后的内容一模一样包括后 ...
- Ansible_利用系统角色重用内容
一.红帽企业Linux系统角色 1.RHEL系统角色 名称 状态 角色描述 rhel-system-roles.kdump 全面支持 配置kdump崩溃恢复服务 rhel-system-roles.n ...
- flink-cdc读取postgres报异常,没有发布表
异常信息 must be superuser to create FOR ALL TABLES publication 必须是超级用户才能为所有发布表创建 网上搜索了一天,都毫无头绪,后面搜索到了一个 ...
- xml 解析之 JDOM解析
JDOM 是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序.JDOM 是一个开源项目,它基于树形结构,利用纯 Java 的技术对 XML 文档实现解析.生成.序列化及多种操 ...
- HEVC之路0:HM16.18的运行+码流分析
1.HM下载 HM不能直接网页下载,因为它是采用svn来管理代码的,因此需要利用svn下载,这里采用TortoiseSVN(软件下载地址为https://tortoisesvn.net/)进行下载. ...
- JVM学习心得—JVM内存模型(个人整理,请勿转载)
一.运行时数据区域 线程私有的:程序计数器+虚拟机栈+本地方法栈 线程共享的:堆+方法区(运行时常量池)+直接内存(非运行时数据区的一部分) *JDK1.8后将方法区废除,新增元空间. 1.1 程序计 ...
- Go benchmark 详解
前言 基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器. 在日常生活中,我们使用速度 m/s(单位时间内物体移动的距离)大小来衡量一辆跑车的性能,同理 ...