AtCoder Beginner Contest 156

传送门

A - Beginner

题意:

  • 给你\(n,k\),如果\(n < 10\)就输出\(100 \times (10 -n) + k\),否则输出\(k\).

思路:

  • 签到。

  • Code
    
     	#include<bits/stdc++.h>
      using namespace std;
      #define de_x(x) cout<<"debug_val: "<<x<<endl;
      #define de_ve(x) for(auto it: x) cout<<it<<" ";
      #define rep(i,a,n) for (int i=a;i<n;i++)
      #define _rep(i,a,n) for (int i=a;i<=n;i++)
      #define per(i,a,n) for (int i=n-1;i>=a;i--)
      #define pb push_back
      #define mp make_pair
      #define fi first
      #define se second
      #define SZ(x) ((int)(x).size())
      #define all(x) (x).begin(),(x).end()
      typedef long long ll;
      typedef vector<int> VI;
      typedef pair<int,int> PII;
      typedef double db;
      std::mt19937 mrand(random_device{}());
      int rnd(int x) { return mrand() % x ; }
      const ll mod=1000000007;
      ll ksm(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
      ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
      int _;
      /***********************/
    

    void run(){
    }
    int main(){
    // for(scanf("%d",&_); ;--) run();
    int n ,r;
    cin>> n >>r;
    if( n < 10 ) r = r + (10 - n )*100;
    cout<<r<<endl;
    return 0;
    }

B - Digits

题意:

  • 给你一个整数\(n\),输出其在\(k\)进制下的位数。

思路:

  • 签到。

  • Code
    
     	#include<bits/stdc++.h>
      using namespace std;
      #define de_x(x) cout<<"debug_val: "<<x<<endl;
      #define de_ve(x) for(auto it: x) cout<<it<<" ";
      #define rep(i,a,n) for (int i=a;i<n;i++)
      #define _rep(i,a,n) for (int i=a;i<=n;i++)
      #define per(i,a,n) for (int i=n-1;i>=a;i--)
      #define pb push_back
      #define mp make_pair
      #define fi first
      #define se second
      #define SZ(x) ((int)(x).size())
      #define all(x) (x).begin(),(x).end()
      typedef long long ll;
      typedef vector<int> VI;
      typedef pair<int,int> PII;
      typedef double db;
      std::mt19937 mrand(random_device{}());
      int rnd(int x) { return mrand() % x ; }
      const ll mod=1000000007;
      ll ksm(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
      ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
      int _;
      /***********************/
    

    void run(){
    }
    int main(){
    // for(scanf("%d",&_); ;--) run();
    int n ,r,cnt =0;
    cin>> n >>r;
    while(n){
    n/=r;
    cnt++;
    }
    cout<<cnt<<endl;
    return 0;
    }

C - Rally

题意:

  • 现有\(N\)个在\(x\)轴上的点,其坐标为为\(X_i\),现在你要在x轴的整数点上随意找一点p,使其\(\sum_{i=1}^{N}{(X_i - p)^2}\) 最小。

思路:

  • 观察题面数据\(1\leq N,X_i \leq 100\)可知,暴力可过。对其\(N\)个点排序过后。求出 1 到max\(X_i\)个点分别在 \(N\)个点下的值,取最小便可。

  • Code
    
     	#include<bits/stdc++.h>
      using namespace std;
      #define de_x(x) cout<<"debug_val: "<<x<<endl;
      #define de_ve(x) for(auto it: x) cout<<it<<" ";
      #define rep(i,a,n) for (int i=a;i<n;i++)
      #define _rep(i,a,n) for (int i=a;i<=n;i++)
      #define per(i,a,n) for (int i=n-1;i>=a;i--)
      #define pb push_back
      #define mp make_pair
      #define fi first
      #define se second
      #define SZ(x) ((int)(x).size())
      #define all(x) (x).begin(),(x).end()
      typedef long long ll;
      typedef vector<int> VI;
      typedef pair<int,int> PII;
      typedef double db;
      std::mt19937 mrand(random_device{}());
      int rnd(int x) { return mrand() % x ; }
      const ll mod=1000000007;
      ll ksm(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
      ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
      int _;
      /***********************/
    

    void run(){
    }
    int main(){
    // for(scanf("%d",&_); ;--) run();
    int n ,r,ans =mod;
    cin>> n ;
    _rep(i,1,n) cin>> a[i];
    sort(a+1,a+n+1);
    _rep(i,1,a[n]){
    int cur = 0;
    _rep(j,1,n){
    cur += ksm(a[j] - i,2);
    // pow(a[j] - i , 2) ,(a[j] -i)*(a[j] -i);都可。
    }
    ans = min(ans,cur);
    }
    cout<<ans<<endl;
    return 0;
    }

D - Bouquet

题意:

  • 你有\(n\)种花,每种一朵,你可以选择最少一朵的花做成花束。但是你不希望花束的数量是\(a\)或则\(b\),问有多少种花束数量的种数。答案对\(10^9+7\)取模。

思路:

  • \(n\)中选\(x\)的选法为\(C_{n}^{m} = \tbinom{n}{x}\),那么对于\(n\) 总共有\(\tbinom{n}{0} + \tbinom{n}{1} + \tbinom{n}{3} + \cdots +\tbinom{n}{n} = 2^n\)种选法。那么答案就是总选数减去从n中选0,a,b,即\(2^n - \tbinom{n}{a} -\tbinom{n}{b}\).
  • \[\]

\[- 那么现在问题是如何高效的求$\tbinom{n}{m} \% (10^9+7)$,当$n$ 很大,$m$较小,如题面$2 \leq n \leq 10^9$,$1 \leq m \leq 2 \times 10^5$.可利用乘法逆元进行求值; - 当$n$较小$m$较大时,可用Lucas定理"E题"(有关逆元,如何逆元对组合数推导和Lucas定理求组合数,请谷歌)。 - <details> <summary>Code</summary> <pre><code> #include&#60;bits/stdc++.h> using namespace std; #define de_x(x) cout<<"debug_val: "<<x<<endl; #define de_ve(x) for(auto it: x) cout<<it<<" "; #define rep(i,a,n) for (int i=a;i<n;i++) #define _rep(i,a,n) for (int i=a;i<=n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define fi first #define se second #define SZ(x) ((int)(x).size()) #define all(x) (x).begin(),(x).end() typedef long long ll; typedef vector<int> VI; typedef pair<int,int> PII; typedef double db; std::mt19937 mrand(random_device{}()); int rnd(int x) { return mrand() % x ; } const ll MOD=1e9 +7; ll ksm(ll a,ll b) {ll res=1;a%=MOD; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} int _; /***********************/ //const long mod =1e9+7; void run(){ } long Con(int n,int k){ long x =1,y =1; for(int i=1;i&#60;=k;i++){ x = x*(n-i+1) %MOD; y = y*i %MOD; } return x * ksm(y ,MOD-2)%MOD; } int main(){ // for(scanf("%d",&_); _;_--) run(); long n,a,b; cin>> n >> a>> b ; long ans = ksm(2,n); ans -= Con(n,a); ans -= Con(n,b); ans--; cout&#60;&#60;(ans%MOD +MOD)%MOD&#60;&#60;endl; return 0; } </code> </pre> </details> ### **E - Roaming** **题意:** - 有$n$个房间。某个房间的一人走到另一个房间被称为移动。现在确实发生的$k$次移动。那么这$n$个房间人数的可能有多少种? **思路:** - 我们假设这$n$个房间,每个房间都只有1个人,移动后,一些房间人数减少,另一些房间人数增加。**人数减少的房间不能容纳人**。假设有$x$次移动,那么有$\tbinom{n}{x}$种选择方式走出房间。然后我们有$\tbinom{n-x-1+x}{x}$种方式来把移动出来的人安置进去。种数相乘就是答案。 - <details> <summary>Code</summary> <pre><code> #include&#60;bits/stdc++.h> using namespace std; #define de_x(x) cout<<"debug_val: "&#60;&#60;x&#60;&#60;endl; #define de_ve(x) for(auto it: x) cout&#60;&#60;it&#60;&#60;" "; #define rep(i,a,n) for (int i=a;i&#60;n;i++) #define _rep(i,a,n) for (int i=a;i<=n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define fi first #define se second #define SZ(x) ((int)(x).size()) #define all(x) (x).begin(),(x).end() typedef long long ll; typedef vector&#60;int> VI; typedef pair&#60;int,int> PII; typedef double db; std::mt19937 mrand(random_device{}()); int rnd(int x) { return mrand() % x ; } const ll mod=1000000007; ll ksm(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} int _; /***********************/ void run(){ } t int N = 4e5+5; ll f[N],invf[N]; ll Con(int n ,int m){ return f[n]*invf[n-m]%MOD*invf[m]%MOD; } int n , k; int main(){ // for(scanf("%d",&_); _;_--) run(); f[0] = invf[0] = f[1]= invf[1] =1; for(int i=2 ;i&#60;N;i++){ f[i] = f[i-1]*i%MOD; invf[i] =(MOD -MOD /i)*invf[MOD%i]%MOD; } for(int i =2 ;i&#60;N;i++) invf[i] =invf[i-1]*invf[i]%MOD; cin>>n>>k; ll ans =0; for(int i=0;i&#60;=n&&&i&#60;=k;i++) ans = (ans+Con(n,i)*Con(n-1,i)%MOD)%MOD; ans = (ans%MOD +MOD)%MOD; cout&#60;&#60;ans&#60;&#60;endl; return 0; } </code> </pre> </details> ### **F - Modularness** - 告辞!\]

posted @ 2020-02-23 15:23  NukezY  阅读(146)  评论(0)    收藏  举报