2024.9.27校测
T1
题目描述
输入格式
第
接下来
输出格式
对于每组数据:
-
如果
,输出一行,包含一个整数: ,其中 表示刚好支付的方案数。 -
如果
,输出一行,包含两个整数: ,其中 表示刚好支付的方案数, 表示所有可能
支付方式的张数和。
输入样例1
2 2
3 4 21
2 4 12
输出样例1
2 13
4 18
样例1解释
对于
对于
输入样例2
2 1
3 4 21
2 4 12
输出样例2
2
4
数据规模
对于
对于另外
对于另外
对于
题解
设
考虑
以上两种情况是无解的,直接输出
考虑到将
考虑每变化一次张数会变大或变小
完整代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int extend_gcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1;
y = 0;
return 0;
}
int d = extend_gcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
int T, opt, a, b, c;
signed main(){
freopen("pay.in", "r", stdin);
freopen("pay.out", "w", stdout);
scanf("%lld%lld", &T, &opt);
while(T--){
scanf("%lld%lld%lld", &a, &b, &c);
if(c % gcd(a, b) != 0){
if(opt == 1)
printf("0\n");
else
printf("0 0\n");
continue;
}
int d = gcd(a, b);
int x, y;
extend_gcd(a, b, x, y);
x *= c / d;
y *= c / d;
int dis;
if(x < 0){
dis = ceil((-x) * 1.0 / (b / d));
x += dis * (b / d);
y -= dis * (a / d);
} else {
dis = floor(x * 1.0 / (b / d));
x -= dis * (b / d);
y += dis * (a / d);
}
if(y >= 0){
printf("%lld", y / (a / d) + 1);
if(opt == 1)
printf("\n");
else {
printf(" ");
int ans1 = x + y, ans2 = y % (a / d) + x + y / (a / d) * (b / d);
int ans = (ans1 + ans2) * (y / (a / d) + 1) / 2;
printf("%lld\n", ans);
}
} else {
if(opt == 1)
printf("0\n");
else
printf("0 0\n");
continue;
}
}
return 0;
}
T2
题目描述
现在,
从
从
这个数可能很大,你只需将答案对
输入格式
第
接下来 dir n m
,其中
输出格式
对于每组数据,输出一行表示答案。
输入样例
2
1 3 2
2 3 2
输出样例
4
6
样例解释
表格左上角长成这样(行列都是从
这样从
向左上角看,会看到:
数据规模
对于
对于
题解
考虑道题目生成的是杨辉三角,那么根据二项式定理可得,每一个数字就是
考虑往左上方看,可以看到的数的和为
预处理一下阶乘就做完了。
完整代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9 + 7, N = 1e6 + 9;
int T, pro[N];
int extend_gcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1;
y = 0;
return 0;
}
int d = extend_gcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int inv(int a, int m){
int x, y;
int d = extend_gcd(a, m, x, y);
return (x % m + m) % m;
}
int C(int n, int m){
int div = pro[m] * pro[n - m] % MOD;
return pro[n] * inv(div, MOD) % MOD;
}
signed main(){
freopen("sumcomb.in", "r", stdin);
freopen("sumcomb.out", "w", stdout);
pro[0] = 1;
for(int i = 1; i <= 1000000; i++)
pro[i] = pro[i - 1] * i % MOD;
scanf("%lld", &T);
while(T--){
int d, n, m;
scanf("%lld%lld%lld", &d, &n, &m);
if(m > n){
printf("0\n");
continue;
}
if(d == 1)
printf("%lld\n", C(n + 1, m + 1));
else
printf("%lld\n", C(n + 1, m));
}
return 0;
}
T3
题目描述
输入格式
第
接下来
第
接下来
输出格式
对于每组数据,输出一行,包含一个整数,即方案数,因为结果可能很大,只需要对
输入样例
2
4 2 3
1 2 3 4
4 1 1
1 2 3 4
输出样例
3
1
样例解释
对于第一组数据,一共有
对于第二组数据,一共有
数据规模
对于
对于
对于
对于
题解
以下做法来自大佬 huangkx。
原题目要求的是
将
考虑到
运用莫比乌斯反演,可以得出原式
再将其转换回二进制定义,可以得出答案
现在
完整代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 9, L = (1 << 20), P = 1000000007;
int sum[L], fac[N], inv[N];
int extend_gcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1;
y = 0;
return 0;
}
int d = extend_gcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int invv(int a, int m){
int x, y;
int d = extend_gcd(a, m, x, y);
return (x % m + m) % m;
}
void Init(){
fac[0] = 1;
for(int i = 1; i <= N; i++)
fac[i] = fac[i - 1] * i % P;
inv[N] = invv(fac[N], P);
for(int i = N - 1; i >= 0; i--)
inv[i] = inv[i + 1] * (i + 1) % P;
}
int C(int x, int y){
if(x < y)
return 0;
return fac[x] * inv[y] % P * inv[x - y] % P;
}
signed main(){
freopen("kor.in", "r", stdin);
freopen("kor.out", "w", stdout);
Init();
int T;
scanf("%lld", &T);
while(T--){
int n, k, r;
scanf("%lld%lld%lld", &n, &k, &r);
if(r >= L){
printf("0\n");
continue;
}
for(int i = 0; i < L; i++)
sum[i] = 0;
int g = 0;
for(int i = 0; i < 20; i++)
if((r & (1 << i)) == 0)
g |= (1 << i);
while(n--){
int x;
scanf("%lld", &x);
int y = 0;
for(int i = 0; i < 20; i++)
if((x & (1 << i)) == 0)
y |= (1 << i);
sum[y]++;
}
for(int i = 0; i < 20; i++)
for(int j = L - 1; j >= 0; j--)
if((j & (1 << i)) != 0)
sum[(j ^ (1 << i))] += sum[j];
int ans = 0;
for(int d = 0; d < L; d++)
if((d & g) == 0){
if((__builtin_popcount(d) & 1) == 1)
ans = (ans - C(sum[(d | g)], k) % P + P) % P;
else
ans = (ans + C(sum[(d | g)], k) % P) % P;
}
printf("%lld\n", ans);
}
return 0;
}
本文来自博客园,作者:JPGOJCZX,转载请注明原文链接:https://www.cnblogs.com/JPGOJCZX/p/18436494
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】