打这类比赛简直就是神仙打架,杜老师吉老师一大堆world final都来了,根本没机会参加决赛(我真菜)我就当补补题,拿一件衣服就够了~~
题目链接:https://www.jisuanke.com/contest/3258?view=challenges
A 爱喝「肥宅快乐水」的班长
题目描述
现在已经是暑假了!这周日,码队的弟弟所在的班级——上海某中学高二 33 班的同学们准备在码队弟弟的带领下(码队的弟弟是这个班的班长),举办一场派对。
码队的弟弟让两名同学打开手机 「云闪付」app,在云闪付在线商城上采购饮料。经过这两名同学统计,发现一共需要买 nn 瓶饮料。而在云闪付在线商城上,一共有 mm 种不同的饮料(包括「肥宅快乐水」,并假设云闪付在线商城上的每种饮料的购买数量都没有限制)。由于码队的弟弟喜欢喝「肥宅快乐水」,所以这两名同学决定至少要买一瓶「肥宅快乐水」。
这样看来,饮料购买的方案实在是太多了!两位同学突发奇想,想让你帮忙计算:总共有多少种购买饮料的方案。(答案对 10^9 + 7109+7 取模,同种饮料都是一样的,不作区分。)
输入格式
有多组数据。
第一行输入一个整数 TT, 表示有 TT 组数据( 1\le T \le 10^41≤T≤104 )。
对于每一组测试数据:输入一行,包含两个整数 n, mn,m,以空格分隔,分别表示这两位同学需要买 nn 瓶饮料(其中必须有一瓶是「肥宅快乐水」),云闪付在线商城中一共有 mm 种包括「肥宅快乐水」在内的不同的饮料。(1 \le n,m \le 10^31≤n,m≤103)
输出格式
对于每一组测试数据,输出一行。
每行只包含一个整数,表示有多少种购买饮料的方案。
提示
假设我们用 FF 表示「肥宅快乐水」,用 AA 表示某种其他饮料。
针对样例输入 1:
对于第一组测试数据,只有 11 种购买饮料的方案:(FF)。
对于第二组测试数据,有 22 种购买饮料的方案:(FF, FF),(FF, AA)。
输出时每行末尾的多余空格,不影响答案正确性
样例输入1复制
2
1 1
2 2
样例输出1复制
1
2
样例输入2复制
3
1 2
2 3
3 3
样例输出2复制
1
3
6
不会写。。。
献上题解:
嗯,懂了。关键词:隔板法(要求:每个箱子至少要装一个东东)如果没有要求至少包含一瓶可乐。那么答案就是
个人猜测~
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=3e3+10;
ll n,m;
ll c[N][N];
void init(){
c[0][0] = 1;
for (int i = 1; i <= 3000; i++)
{
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++)
c[i][j]=(c[i - 1][j - 1] + c[i - 1][j])%mod;
}
}
int main()
{
init();
int _;
cin>>_;
while(_--)
{
scanf("%lld%lld",&n,&m);
printf("%lld\n",c[n+m-2][m-1]);
}
}
B-整数对
题目描述
码队的弟弟喜欢做数学题。这不,听说你也喜欢做数学题,码队的弟弟非常高兴,决定立刻送给你一道数学题,请你完成。
给定三个整数 n,m,pn,m,p ,求满足 a \times b = k \times pa×b=k×p(( 1 \le a \le n, 1 \le b \le m, k1≤a≤n,1≤b≤m,k为任意正整数 )) 的整数对 (a,b)(a,b) 的数量。
输入格式
有多组数据。
第一行输入一个整数,表示有 TT 组数据( 1 \le T \le 101≤T≤10 )。
对于每一组测试数据:输入一行,包含三个整数 n,m,pn,m,p ,以空格分隔( 1 \le n,m \le 10^9, 1 \le p \le 10^51≤n,m≤109,1≤p≤105 )。
输出格式
对于每一组数据,输出一行。
每行只包含一个整数,表示满足条件的整数对的数量。
提示
针对样例输入1:一共有 55 个整数对,分别是 (1,3),(2,3),(3,3),(3,1),(3,2)(1,3),(2,3),(3,3),(3,1),(3,2)。
输出时每行末尾的多余空格,不影响答案正确性
样例输入1复制
1
3 3 3
样例输出1复制
5
样例输入2复制
1
10 20 15
样例输出2复制
29
也不会,献上题解,群里大佬说,这类题叉姐连续三年在湖南出过(包括湘潭邀请赛)(2016,2017,2018)
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int _;
cin>>_;
while(_--)
{
ll n,m,p;
cin>>n>>m>>p;
ll ans=0;
ll x=n/p;
ans=x*m;
for(ll r=1;r<p;++r)
{
ll gc=gcd(r,p);
ll tmp=p/gc;
ll n1=m/tmp;
ll n2;
if(r<=n%p)
{
n2=x+1;
ans+=n1*n2;
}
else{
n2=x;
ans+=n1*n2;
}
}
printf("%lld\n",ans);
}
}