题目链接:https://codeforces.com/contest/1475
A题
就是个水题。
B题
判断数n是否能由a个2020和b个2021组成,
刚开始没绕过弯,wa了两次,然后突然灵机一现,
int c = n/2020;
int d = n%2020;
只要c>=d,则输出yes,
代码:
#include<bits/stdc++.h>
using namespace std;
int t,n;
int main(){
cin >> t;
while(t--){
cin >> n;
int a = n/2020;
int b = n%2020;
if(a>=b) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
C题
配对问题,就是一个男生不能同时与两个女生跳舞,同样,女生也不行。
就是用总的排列次数 - 男生不符合条件的次数 - 女生不符合条件的次数;
其中计算男生不符合条件的次数用如下方法:
for(int i = 0;i < k;i++)
{
cin >> m;
c[m]++;
sum+=c[m]-1;
}
代码:
#include<bits/stdc++.h>
using namespace std;
int c[250000] = {0},d[250000] = {0};
int main()
{
int t;
cin >> t;
while(t--)
{
long long int a,b,k,m,sum = 0,all = 0;
cin >> a >> b >> k;
for(int i = 0;i < k;i++)
{
cin >> m;
c[m]++;
sum+=c[m]-1;
}
for(int i = 0;i < k;i++)
{
cin >> m;
d[m]++;
all+=d[m]-1;
}
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
long long int r = (k*(k-1))/2 - all - sum;
cout <<r <<"\n";
}
}
E题
就是在n个数中找k个最大的数,问有多少种可能?
就从大到小排序,并记录这个数出现的次数,然后求组合数。
其中,通过快速幂 + 费马小定理 求的组合数。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 1005
typedef long long ll;
const int mod = 1e9+7;
int t,n,k;
long long ans;
bool cmp(int a,int b){
return a>b;
}
inline ll qpow(ll a , ll b , ll modd){ //快速幂
ll ans = 1 ;
while(b){
if(b & 1) ans = ans * a % modd ;
a = a * a % modd ;
b >>= 1 ;
}
return ans ;
}
inline ll C(ll n , ll m){ //组合数Cnm的值
ll ans1 = 1 , ans2 = 1 , ans3 = 1 ;
for(ll i = 1 ; i <= n ; i++)
ans1 = ans1 * i % mod ;
for(ll i = 1 ; i <= m ; i++)
ans2 = ans2 * i % mod ;
for(ll i = 1 ; i <= n - m ; i++)
ans3 = ans3 * i % mod ;
return ans1 * qpow(ans2 , mod - 2 , mod) % mod * qpow(ans3 , mod - 2 , mod) % mod ;
//费马小定理
}
int main(){
cin >> t;
while(t--){
ans = 1;
int a[N] = {0};
int b[N] = {0};
int c[N] = {0};
int cnt = 0;
cin >> n >> k;
for(int i=1;i<=n;i++)
cin >> a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(a[i]!=a[i-1]){
cnt ++;
b[cnt] = a[i];
c[cnt] ++;
}
else {
c[cnt]++;
}
}
int i = 1;
while(k!=0&&i<=cnt){
if(k>c[i]) {
k -= c[i];
i++;
}
else {
ans = C(c[i],k);
break;
}
}
cout << ans%mod << endl;
}
}