Codeforces Round #678 (Div. 2)

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;
}
原文地址:https://www.cnblogs.com/wanwanjiuhao7744/p/13888009.html