SGU 140 Integer Sequences 多元一次同余线性方程
来源:互联网 发布:metasequoia mac 注册 编辑:程序博客网 时间:2024/05/13 22:36
题目链接点这儿
对于普通的求解 的,我们可以利用扩展欧几里得求得两数c和d满足,若b是gcd(a,p)的倍数,那么有解,否则无解。
而对于多元的,我们知道对任意a, b来说ax+by永远是gcd(x,y)的倍数,所以我们可以用k*gcd(x,y)代替ax+by,然后对任意的k和z来说k*gcd(x,y) + cz又永远是gcd(gcd(x,y), z)的倍数。从而我们可以不断减少变元的数量。最后化成普通的形式。然后再一步一步倒回来得到所要的系数。
代码如下
#include <bits/stdc++.h>#define up(i, lower, upper) for(int i = lower; i < upper; i++)#define down(i, lower, upper) for(int i = upper-1; i >= lower; i--)using namespace std;typedef pair<int, int> pii;typedef pair<double, double> pdd;typedef vector<int> vi;typedef vector<pii> vpii;typedef long long ll;typedef unsigned long long ull;const double pi = acos(-1.0);const double eps = 1.0e-9;template<class T>inline bool read(T &n){ T x = 0, tmp = 1; char c = getchar(); while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar(); if(c == EOF) return false; if(c == '-') c = getchar(), tmp = -1; while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar(); n = x*tmp; return true;}template <class T>inline void write(T n) { if(n < 0) { putchar('-'); n = -n; } int len = 0,data[20]; while(n) { data[len++] = n%10; n /= 10; } if(!len) data[len++] = 0; while(len--) putchar(data[len]+48);}///---------------------------------------------------------int exgcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1, y = 0; return a; } else { int r = exgcd(b, a%b, y, x); y -= x*(a/b); return r; }}int a[101], x[101], y[101];int main() { int n, p, b; read(n), read(p), read(b); up(i, 0, n) { read(a[i]); a[i]%=p; } int gcd_fn = a[0]; up(i, 1, n) gcd_fn = exgcd(gcd_fn, a[i], y[i], x[i]); gcd_fn = exgcd(gcd_fn, p, y[n], x[n]); if(b%gcd_fn != 0) { puts("NO"); return 0; } puts("YES"); int mul = b/gcd_fn; x[0] = 1; down(i, 0, n) { while(y[i+1] < 0) y[i+1] += p; mul = mul*y[i+1]%p; while(x[i] < 0) x[i] += p; x[i] = x[i]*mul%p; } up(i, 0, n) printf("%d ", x[i]); return 0;}
0 0
- SGU 140 Integer Sequences 多元一次同余线性方程
- SGU 140 Integer Sequences (多元线性同余方程)
- POJ 2891 多元同余线性方程
- HDU 1573 多元同余线性方程
- sgu 140 Integer Sequences
- sgu 140 Integer Sequences 扩展GCD
- SGU 140 Integer Sequences(扩展欧几里得)
- SGU 140 Integer Sequences(拓展欧几里得)
- [SGU]140. Integer Sequences
- Integer Sequences SGU
- 高斯消元同余线性方程的模板
- 一次同余方程
- 一次同余方程
- SGU 119. Magic Pairs 同余+枚举
- POJ 2635 The Embarrassed Cryptographer (同余线性方程+素数筛)
- POJ 2947 Widget Factory <高斯消元同余线性方程>
- Mdular Linear Equatin 模线性方程(同余方程)
- lightoj 1078 - Integer Divisibility 【同余】
- 杭电1004
- 目前洗衣房设备的产品状态
- Keepalived 简介
- 内存泄露工具
- INTERNET_ERROR_BASE_X 's error message
- SGU 140 Integer Sequences 多元一次同余线性方程
- 构建基于Javascript的移动CMS——生成博客(二).路由
- 背包问题总结二
- "><img src=hi onerror=alert('XSS By Luan')>
- Java如何实现按指定行读取文件
- 洗涤设备部件离式过滤器如何清洗?
- 通过ADS协议实现与beckhoff控制器的以太网通讯
- wx.233.com/quan/topic/66020
- Merge Intervals & *Longest Palindromic Substring & Multiply Strings