POJ2947 DAZE [Gauss]

2024-06-17 03:32
文章标签 gauss daze poj2947

本文主要是介绍POJ2947 DAZE [Gauss],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目是要求建立一个方程组:

(mat[1][1]*x[1] + mat[1][2]*x[2] + … + mat[1][n]*x[n])%7 =mat[1][n+1]

(mat[2][1]*x[1] + mat[2][2]*x[2] + … + mat[2][n]*x[n])%7 =mat[2][n+1]

(mat[m][1]*x[1] + mat[m][2]*x[2] + … + mat[m][n]*x[n])%7 =mat[m][n+1]

如果有解输出解得个数,如果无解Inconsistent data.无穷多组解Multiple solutions.


扯一句,什么时候无解?

系数矩阵的秩 不等于 增广矩阵的秩 时。反映在程序上就是:

for (i = row; i < N; i++)
{
if (a[i][M] != 0)
{
printf("Inconsistent data.\n");
}
}

什么时候无穷多解?

当增广矩阵的秩小于行列式的行数的时候。 反映在程序上就是:

if (row < M)
{
printf("Multiple solutions.\n");
}

好了,程序如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
int m,n;//n lines
int M,N;
int a[333][333];
int times[333];
int ans[333];
int MOD=7;
int getday(char* s)
{if(strcmp(s,"MON")==0) return 1;if(strcmp(s,"TUE")==0) return 2;if(strcmp(s,"WED")==0) return 3;if(strcmp(s,"THU")==0) return 4;if(strcmp(s,"FRI")==0) return 5;if(strcmp(s,"SAT")==0) return 6;if(strcmp(s,"SUN")==0) return 7;
}int extend_gcd(int A, int B, int &x, int &y)
{if (B == 0){x = 1, y = 0;return A;}else{int r = extend_gcd(B, A%B, x, y);int t = x;x = y;y = t - A / B*y;return r;}
}int lcm(int A, int B)
{int x = 0, y = 0;return A*B / extend_gcd(A, B, x, y);
}
void Guass()
{int i, j, row, col;for (row = 0, col = 0; row < N && col < M; row++, col++){for (i = row; i < N; i++)if (a[i][col]) break;if (i == N){row--;continue;}if (i != row)for (j = 0; j <= M; j++) swap(a[row][j], a[i][j]);for (i = row + 1; i < N; i++){if (a[i][col]){int LCM = lcm(a[row][col], a[i][col]);//利用最小公倍数去化上三角int ch1 = LCM / a[row][col], ch2 = LCM / a[i][col];for (j = col; j <= M; j++)a[i][j] = ((a[i][j] * ch2 - a[row][j] * ch1)%MOD + MOD)%MOD;}}}for (i = row; i < N; i++)//无解{if (a[i][M] != 0){printf("Inconsistent data.\n");return;}}if (row < M)//无穷多解{printf("Multiple solutions.\n");return;}//唯一解时for (i = M - 1; i >= 0; i--){int ch = 0;for (j = i + 1; j < M; j++){ch = (ch + ans[j] * a[i][j] % MOD)%MOD;}int last = ((a[i][M] - ch)%MOD + MOD)%MOD;int x = 0, y = 0;int d = extend_gcd(a[i][i], MOD, x, y);x %= MOD;if (x < 0) x += MOD;ans[i] = last*x / d%MOD;if (ans[i] < 3) ans[i] += 7;}for (int i = 0; i < M; i++){if (i == 0)printf("%d", ans[i]);elseprintf(" %d", ans[i]);}printf("\n");
}int main()
{while(scanf("%d%d",&m,&n)!=EOF){if(m==0&&n==0)break;M=m,N=n;memset(a,0,sizeof(a));memset(times,0,sizeof(times));memset(ans,0,sizeof(ans));for(int i=0;i<n;i++){int prodnum;char str1[11],str2[11];scanf("%d%s%s",&prodnum,str1,str2);for(int j=0;j<prodnum;j++){int tmp;scanf("%d",&tmp);a[i][tmp-1]++;a[i][tmp-1]%=MOD;}a[i][m]=(getday(str2)-getday(str1)+1+MOD)%MOD;}Guass();}return 0;
}


这篇关于POJ2947 DAZE [Gauss]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068366

相关文章

Halcon提取边缘线段lines_gauss 算子

Halcon提取边缘线段lines_gauss 算子 edges_color_sub_pix和edges_sub_pix两个算子使用边缘滤波器进行边缘检测。还有一个常用的算子lines_gauss算子,也可以用于提取边缘线段,它的鲁棒性非常好,提取出的线段类型是亚像素精度的XLD轮廓。其原型如下: lines gauss(Image : Lines : Sigma, Low, High, Li

矩阵十题【三】 HDU 1588 Gauss Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:先要知道一组斐波那契数列 i01234567f(i)011235813 下面给你一组数: k,b,n,M  现在知道一组公式g(i)=k*i+b;(i=0,1,2,3...n-1) 让你求出 f(g(i)) 的总和(i=01,2,3,...,n-1),比如给出的数据是

Centos服务器Open Gauss 部署

近期很多的项目由于信创要求使用一些国产的数据库,比如OpenGauss。OpenGuass是华为高斯DB的开源版,内核还是PostgreSQL,商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARM: openEuler 20.3LTS麒麟V10Asianux 7.5 X86: openEuler 20.3LTSCentOS 7.6As

Elasticsearch(9) gauss的使用

elasticsearch version: 7.10.1 在Elasticsearch中,gauss作为衰减函数(decay function)被用于function_score查询中,用于实现基于地理位置或其他数值字段的衰减权重评分。gauss衰减函数模拟了高斯分布,即距离中心点越近的文档,其得分越高;随着距离增大,得分按照高斯分布规律衰减。 gauss的语法 GET /your_inde

halcon line_gauss 线状物提取 (by shany shang)

主程序源代码: dev_close_window () *载入yi'fu'tu'xiang read_image (Angio, 'angio-part') get_image_size (Angio, Width, Height) dev_open_window (0, 0, 3 * Width / 2, 3 * Height / 2, 'black', WindowID) dev_disp

hdu 1588 Gauss Fibonacci 较难

对于Fib序列: (如果用F表示上市中的矩阵就有 F(n+1) = AF(n) 是等比数列,g(i)=k*i+b 是等差数列) F(g(i)) = F(b) + F(b+k)+F(b+2k)+....+F(b+nk)           = F(b) + (A^k)F(b) + (A^2k)F(b)+….+(A^nk)F(b) 提取公因式 F(b)            = F(b) [ E

高斯-塞德尔迭代法Gauss-Seidel_解线性方程组的迭代法

高斯-塞德尔迭代法Gauss-Seidel_解线性方程组的迭代法 标签:计算方法实验 #include <stdio.h>#include <math.h>#define maxn 3int main(){double a[maxn][maxn + 1], x[maxn] = {0};double eps = 1e-9;int n, k, kmax = 100;freopen("gauss

非线性最小二乘法之Gauss Newton、L-M、Dog-Leg

非线性最小二乘法之Gauss Newton、L-M、Dog-Leg 最快下降法 假设 hTF′(x)<0 h^TF'(x) < 0,则h是 F(x) F(x)下降方向,即对于任意足够小的 α>0 \alpha > 0,都满足 F(x+αh)<F(x) F(x+ \alpha h) < F(x)。 现在讨论 F(x) F(x)沿着h方向下降快慢: limα→0F(x)−F(x+αh)

MATLAB入门学习-#6-Jacobi、Gauss-Seidel、SOR迭代法编程练习

MATLAB入门学习-#6-Jacobi、Gauss-Seidel、SOR迭代法编程练习 1.Jacobi迭代法2.Gauss-Seidel迭代法3.SOR迭代法(松弛法) 这三种迭代法是在数值分析课程里学到的,都是求解线性方程组用的,相关的知识可以在数值计算方法的第三章里面找,可以说已经把最核心的怎么算和为什么这么算给交代了,剩下的任务就仅仅是编程实现就完了。 毕竟自己也没怎么

Gauss使用

一、安装高斯数据库 下载高斯数据库安装包 访问高斯数据库官网(https://www.gaussdb.com/)下载对应的安装包。 解压安装包 将下载的压缩包解压到一个目录,例如:/opt/gaussdb。 进入解压后的目录 cd /opt/gaussdb 启动高斯数据库 ./bin/gs_ctl start -D . 二、创建数据库和表 使用psql命令行工具连接到高斯数据库