首页 > 代码库 > POJ1288 Sly Number(高斯消元 dfs枚举)
POJ1288 Sly Number(高斯消元 dfs枚举)
由于解集只为{0, 1, 2}故消元后需dfs枚举求解
#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<vector>#include<cmath>#include<utility>using namespace std;typedef long long LL;const int N = 60, INF = 0x3F3F3F3F;int a[N][N], mod;int x[N];int n, row;int ans[N];bool ok;int gauss(int a[][N], int n){ int i, j; for(i = 0, j = 0; i < n && j < n; i++, j++){ int r = i; for(int k = i; k < n; k++){ if(a[k][j]){ r = k; break; } } if(a[r][j] == 0){ i--; continue; } if(r != i){ for(int k = 0; k <= n; k++){ swap(a[i][k], a[r][k]); } } for(int k = i + 1; k < n; k++){ if(a[k][j]){ int x1 = a[i][j], x2 = a[k][j]; for(int l = j; l <= n; l++){ a[k][l] = (a[k][l] * x1 - x2 * a[i][l]) % mod; } } } } return i;}void dfs(int r){ if(r == -1){ ok = 1; return; } if(ok){ return; } int x = 0; while(x < n && a[r][x] == 0){ x++; } if(x == n){ if(a[r][n]){ return; } for(ans[x] = 0; ans[x] <= 2; ans[x]++){ dfs(r - 1); } return; } int tp = 0; for(int j = x + 1; j < n; j++){ tp += a[r][j] * ans[j]; tp %= mod; } for(ans[x] = 0; ans[x] <= 2; ans[x]++){ if((ans[x] * a[r][x] + tp - a[r][n]) % mod == 0){ dfs(r - 1); } }}int main(){ int t; cin>>t; while(t--){ cin >> mod >> n; for(int i = 0; i < n; i++){ cin >> x[i]; } for(int i = 0; i < n; i++){ a[i][n] = (i == 0); for(int j = 0, k = i; j <= i; j++ , k--){ a[i][j] = x[k]; } for(int j = i + 1, k = n -1; j < n; j++, k--){ a[i][j] = x[k]; } } row = gauss(a, n); ok = 0; dfs(n - 1); if(ok){ printf("A solution can be found\n"); }else{ printf("No solution\n"); } } return 0;}
POJ1288 Sly Number(高斯消元 dfs枚举)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。