链接:https://www.luogu.org/contest/21676
U89068 ls的方程
一开始没有思路,后来听学姐说这道题是组合数学,突然想起来高中数学老师讲过这个模型。
正数解有 C m − 1 n − 1 C_{m-1}^{n-1} Cm−1n−1个,非负数解有 C n + m − 1 m − 1 C_{n+m-1}^{m-1} Cn+m−1m−1个。
这道题主要考察的是组合数学+组合数取模。
组合数取模的模板:https://blog.csdn.net/qq_41117236/article/details/100016718
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n, m, p = 1e9 + 7;
ll quick_mod(ll a, ll b)
{
ll ans = 1;
a %= p;
while (b)
{
if (b & 1)
{
ans = ans * a % p;
b--;
}
b >>= 1;
a = a * a % p;
}
return ans;
}
ll C(ll n, ll m)
{
if (m > n) return 0;
ll ans = 1;
for (int i = 1; i <= m; i++)
{
ll a = (n + i - m) % p;
ll b = i % p;
ans = ans * (a * quick_mod(b, p - 2) % p) %p;
}
return ans;
}
ll Lucas(ll n, ll m)
{
if (m == 0)
return 1;
return C(n % p, m % p) * Lucas(n / p, m / p) % p;
}
int main(void)
{
scanf("%lld%lld", &n, &m);
printf("%lld %lld\n", Lucas(m - 1, n - 1), Lucas(n + m - 1, n - 1));
return 0;
}
U89064 魔法药剂
一开始以为是推公式找规律,结果学姐说就是一道很水的模拟。
还是想复杂了,应该从运算次数只有100次就能看出来是模拟。
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a, b, c, x, y, z;
int main(void)
{
scanf("%lld%lld", &a, &x);
scanf("%lld%lld", &b, &y);
scanf("%lld%lld", &c, &z);
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 1)
{
if (x + y <= b)
{
y = x + y;
x = 0;
}
else if (x + y > b)
{
ll t = b - y;
x -= t;
y += t;
}
}
else if (i % 3 == 2)
{
if (y + z <= c)
{
z = y + z;
y = 0;
}
else if (z + y > c)
{
ll t = c - z;
y -= t;
z += t;
}
}
else
{
if (x + z <= a)
{
x = x + z;
z = 0;
}
else if (x + z > a)
{
ll t = a - x;
z -= t;
x += t;
}
}
}
printf("%lld\n%lld\n%lld\n", x, y, z);
return 0;
}