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

(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]);
else
printf(" %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]的更多相关文章

  1. 高斯消元 & 线性基【学习笔记】

    高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...

  2. [Gauss]POJ2947 Widget Factory

    题意: 有n种小工具要加工,每种工具的加工时间为3到9天,给了m条加工记录.  每条记录 X $s_1$ $s_2$ 分别代表 这个工人在$s_1$到$s_2$(前闭后闭)的时间里加工了X件小工具   ...

  3. hdu 5755(Gauss 消元) &poj 2947

    Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  4. (模板)poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...

  5. OPEN CASCADE Gauss Least Square

    OPEN CASCADE Gauss Least Square eryar@163.com Abstract. The least square can be used to solve a set ...

  6. OpenCASCADE Gauss Integration

    OpenCASCADE Gauss Integration eryar@163.com Abstract. Numerical integration is the approximate compu ...

  7. C# 列主元素(Gauss)消去法 计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. C# 顺序高斯(Gauss)消去法计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 整数矩阵CMO 2102回馈(gauss整数解)

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 本题是CMO(数学 Olympics) 2012 第二题 所以还是很坑的…… ...

随机推荐

  1. 打补丁以及WebLogic Server的版本

    12.1.2开始采用了Oracle传统的opatch打补丁的方式,但在此之前,包括 10.3.x版本以及12.1.1版本还是通过bea的smart update方式来进行. smart update基 ...

  2. Mac下Git的安装和卸载

    1.安装最新版本:https://git-scm.com/download/mac,下载pkg进行安装 2.卸载:运行/usr/local/git/uninstall.sh

  3. 【Sofa】Sofa比赛成绩记录

    最高得到过第4名,然后后面跌倒了第7名,现在追到了第6名.虽然名次还不是最高,但是很开心,今天能在一道一直困扰的题目上有突破,就是那个自行车预测的题目,开始过拟合了.后面进行了一些处理,效果很明显.继 ...

  4. JAVA加解密 -- Base64加解密

    Base64算法实现:可以将任意的字节数组数据,通过算法,生成只有(大小写英文.数字.+./)(一共64个字符)内容表示的字符串数据. private static final String str ...

  5. Node.js meitulu图片批量下载爬虫1.01版

    在 http://www.cnblogs.com/xiandedanteng/p/7614051.html 一文我曾经书写过一个图片下载爬虫,但原有程序不是为下载图片而设计故有些绕,于是稍微改写了一下 ...

  6. perl学习笔记——文件测试

    文件测试主要用于查看如文件是否存在.文件大小.文件更新时间等信息. 文件测试操作符 -e  测试文件是否存在: die "Oops!A file called '$filename' alr ...

  7. Java代码格式

    东汉大臣陈蕃有一则这种故事,"一屋不扫何以扫天下",寓意来表明一个大丈夫,假设连自己的居室都不能打扫干净,怎么胸怀天下.<代码整洁之道>就是来劝诫我们程序猿写出更优秀的 ...

  8. Splunk 会议回想: 大数据的关键是机器学习

    作者 Jonathan Allen ,译者 张晓鹏 Splunk的用户大会已经接近尾声.三天时间的会议里,共进行了160多个主题研讨.涵盖了从安全.运营到商业智能.甚至包含物联网,会议中一遍又一遍出现 ...

  9. Java8 更快的原子类:LongAdder(笔记)

    更快的原子类:LongAdder      大家对AtomicInteger的基本实现机制应该比较了解,它们是在一个死循环内,不断尝试修改目标值,知道修改成功,如果竞争不激烈,那么修改成功的概率就很高 ...

  10. Git学习资源推荐

    Git在线练习 http://pcottle.github.io/learnGitBranching/ https://try.github.io/levels/1/challenges/1 Git入 ...