整理的算法模板合集: ACM模板
AcWing 203. 同余方程
直接用拓展欧几里得算法求出x0,我们要求的是最小的正整数解,实际上就是
x
0
x_0
x0在1~b之间的值,也就是
x
0
m
o
d
b
x_0\ mod\ b
x0 mod b的值,注意为了防止有负数,所以我们的答案应该是
(
x
0
m
o
d
b
+
b
)
m
o
d
b
(x_0\ mod\ b+ b)\ mod\ b
(x0 mod b+b) mod b。
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 500007;
int n, m;
int a, b;
int ecgcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1, y = 0;
return a;
}
int d = ecgcd(b, a % b, x, y);
int z = x;x = y;y = z - (a / b) * x;
return d;
}
int main()
{
scanf("%d%d", &a, &b);
int x, y;
ecgcd(a, b, x, y);
printf("%d\n", (x % b + b) % b);
return 0;
}
AcWing 222. 青蛙的约会
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e5 + 7;
typedef long long ll;
ll n, m, x, y;
ll a, b, L;
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 z = x;x = y;y = z - (a / b) * x;
return d;
}
int main()
{
scanf("%lld%lld%lld%lld%lld", &a, &b, &m, &n, &L);
ll d = exgcd(m - n, L, x, y);
if((b - a) % d != 0){
puts("Impossible");
}
else {
x *= (b - a) / d;
ll t = abs(L / d);
printf("%lld\n", (x % t + t) % t);
}
return 0;
}
AcWing 202. 最幸运的数字
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 50007;
typedef long long ll;
ll n, m, L;
ll a, b, c, d;
int kcase;
ll gcd(ll a, ll b){
if(b == 0)return a;
return gcd(b, a % b);
}
ll mul(ll a, ll b, ll c){
ll res = 0;
while(b){
if(b & 1)res = (res + a) % c;
a = (a + a) % c;
b >>= 1;
}
return res;
}
ll qpow(ll a, ll b, ll c){
ll res = 1;
while(b){
if(b & 1)res = mul(res, a, c);
a = mul(a, a, c);
b >>= 1;
}
return res;
}
ll get_euler(ll c){
ll res = c;
for(ll i = 2; i * i <= c; ++ i){
if(c % i == 0){
while(c % i == 0)c /= i;
res = res / i * (i - 1);
}
}
if(c > 1)res = res / c * (c - 1);
return res;
}
int main()
{
while(scanf("%lld", &L) != EOF && L != 0) {
ll d = gcd(L, 8);
ll C = 9 * L / d;
ll phi = get_euler(C);
ll res = 1e18;
//cout << phi << endl;
if(C % 2 == 0 || C % 5 == 0)res = 0;
else {
for(ll d = 1; d * d <= phi; ++ d){
if(phi % d == 0){
if(qpow(10, d, C) == 1)res = min(res, d);
if(qpow(10, phi / d, C) == 1)res = min(res, phi / d);
}
}
}
printf("Case %d: %lld\n", ++ kcase, res);
}
return 0;
}
AcWing 1298. 曹冲养猪
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef __int128 ll;
const int N = 50007;
int n;
int a[N];
int m[N];
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 z = x;x = y;y = z - (a / b) * x;
return d;
}
int main()
{
ll M = 1;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i){
scanf("%d%d", &m[i], &a[i]);
M *= m[i];
}
ll res = 0;
for(int i = 1; i <= n; ++ i){
ll Mi = M / m[i];
ll ti, y;
ll d = exgcd(Mi, m[i], ti, y);
res += a[i] * ti * Mi;
}
printf("%lld\n", (res % M + M) % M);//可能为负数,所以需要处理一下
return 0;
}