Codeforces Round #678 (Div. 2)
T1 Reorder
mean
\(\quad\)给你一些整数,让你随便排序,求\(\Sigma_{i = 1}^{n}{\Sigma_{j = i}^{n}{\frac{a_j}{j}}}\)能否等于\(m\)
idea
\(\quad\)考虑抵消,其实就问\(\Sigma_{i = 1}^{n}{a_i}\)是否会等于\(m\)
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<climits>
#include<sstream>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n , m;
cin >> n >> m;
int sum = 0;
for(register int i = 1 ; i <= n ; i++)
{
int c;
cin >> c;
sum += c;
}
if(sum == m){cout << "YES" << endl;}
else{cout << "NO" << endl;}
}
return 0;
}
T2 Prime Square
mean
\(\quad\)给你一个正整数\(n\),要求你输出一个\(n * n\)的矩阵,满足每个数都是非质数,所有行列之和为质数。
idea
\(\quad\)考虑在对角线填数,其余上1,暴力模拟要上那个数就好了。
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<climits>
#include<sstream>
using namespace std;
const int N = 1e5 + 10;
bool book[N] ; int tot = 0 ; int p[N];
void build()
{
for(register int i = 2 ; i <= 1e5 ; i++)
{
if(book[i] == 1){continue;}
tot++ ; p[tot] = i;
for(register int j = i + i ; j <= 1e5 ; j += i)
{
book[j] = 1;
}
}
}
int main()
{
int t;
cin >> t;
build();
while(t--)
{
int n;
cin >> n;
int m = 1;
for(register int i = 1 ; i <= tot ; i++){if(p[i] >= n){if(book[p[i] - n + 1]){m = p[i] ; break;}}}
m = m - n + 1;
if(book[n] == 0){m = 1;}
for(register int i = 1 ; i <= n ; i++)
{
for(register int j = 1 ; j <= n ; j++)
{
if(i == j){cout << m << " ";}
else{cout << 1 << " ";}
}
cout << endl;
}
}
return 0;
}
T3 Binary Search
mean
\(\quad\)给你一串二分查找的代码,有一个长\(n\)的数列,有一个元素\(x\),在位置\(pos\),问这个数列有多少可能的形式,答案对\(1e9 + 7\)取膜。
idea
\(\quad\)考虑复现这个过程,在需要大于\(x\)的地方计数,再在需要小于\(x\)的地方计数,最后再在随便取的地方计数,乘起来就是答案。说具体一点:
- 在当前元素需要小于\(x\)的位置求所有小于\(x\)的元素在此的排列方案
- 在当前元素需要大于\(x\)的位置求所有大于\(x\)的元素在此的排列方案
- 在当前元素可以随便取的位置求剩余元素(除\(x\))外的排列方案
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<climits>
#include<sstream>
using namespace std;
#define int long long
const int Mod = 1e9 + 7;
int L , R;
void check(int n , int p)
{
int l = 0 , r = n;
while(l < r)
{
int mid = (l + r) / 2;
if(mid <= p){l = mid + 1 ; if(mid != p){L++;}}
else{r = mid ; R++;}
}
}
signed main()
{
int n , x , p;
cin >> n >> x >> p;
check(n , p);
int ans = 1;
for(register int i = 1 ; i <= L ; i++){ans *= x - i ; ans %= Mod;}
for(register int i = 1 ; i <= R ; i++){ans *= n - x - i + 1 ; ans %= Mod;}
for(register int i = 1 ; i <= n - L - R - 1 ; i++){ans *= i ; ans %= Mod;}
cout << ans;
return 0;
}