HDU-1573-X问题(线性同余方程组)
2024-08-26 21:52:08
链接:
https://vjudge.net/problem/HDU-1573
题意:
求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10)。
思路:
解线性同余方程组,得到\(x+k*m \leq n\)。
解为\(1+(n-x)/m\)。
当x为0时答案要减一。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
typedef long long LL;
const int INF = 1e9;
const int MAXN = 1e6+10;
LL a, b, c, k, n, lcm;
int m;
LL M[20], A[20];
LL ExGcd(LL a, LL b, LL &x, LL &y)
{
if (b == 0)
{
x = 1, y = 0;
return a;
}
LL d = ExGcd(b, a%b, x, y);
LL tmp = x;
x = y;
y = tmp - (a/b)*y;
return d;
}
LL ExCRT()
{
LL res = A[1], mod = M[1];
LL x, y, gcd;
for (int i = 2;i <= m;i++)
{
gcd = ExGcd(mod, M[i], x, y);
if ((A[i]-res)%gcd)
return -1;
x = (x*(A[i]-res))/gcd;
x = (x%(M[i]/gcd)+(M[i]/gcd))%(M[i]/gcd);
res = res+mod*x;
mod = (mod*M[i])/gcd;
res %= mod;
}
lcm = mod;
return res;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%lld%d", &n, &m);
for (int i = 1;i <= m;i++)
scanf("%lld", &M[i]);
for (int i = 1;i <= m;i++)
scanf("%lld", &A[i]);
LL res = ExCRT();
if (res == -1 || res > n)
puts("0");
else
{
printf("%lld\n", (n-res)/lcm+(res!=0));
}
}
return 0;
}
最新文章
- SQL Server 存储过程生成insert语句
- Web 开发人员系统重装备忘录
- 第五章项目:QuickHit
- 前后数据交互(ajax) -- 初始化页面表格
- 【转】wireshark过滤规则
- Linux脚本
- WordPress批量修改文章内容、URL链接、文章摘要
- hdu 1159 Common Subsequence(LCS最长公共子序列)
- html5 canvas 实现简单的画图
- maven overlays 合并多个war
- 虚拟数据库_json_ajax
- 【Unity3D与23种设计模式】模板方法模式(Template Method)
- Toad for Oracle 创建表空间和用户
- 模拟Oracle行迁移和行链接
- C语言的三目运算符(x=a?b:c):条件运算符
- make 命令【转】
- js 图片无缝滚动
- 3,EasyNetQ-发布/订阅
- 【硅谷问道】Chris Lattner 访谈录(上)
- OC Copy基本使用(深拷贝和浅拷贝)