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<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<=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<<(ans%MOD +MOD)%MOD<<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<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(){
}
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<N;i++){
f[i] = f[i-1]*i%MOD;
invf[i] =(MOD -MOD /i)*invf[MOD%i]%MOD;
}
for(int i =2 ;i<N;i++) invf[i] =invf[i-1]*invf[i]%MOD;
cin>>n>>k;
ll ans =0;
for(int i=0;i<=n&&&i<=k;i++)
ans = (ans+Con(n,i)*Con(n-1,i)%MOD)%MOD;
ans = (ans%MOD +MOD)%MOD;
cout<<ans<<endl;
return 0;
}
</code>
</pre>
</details>
### **F - Modularness**
- 告辞!\]

浙公网安备 33010602011771号