#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;//const int mod = 1e9+7;constint mod =998244353;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];int sel =0;int sum =0;int maxx =0;signedmain(){int t;
cin>>t;while(t--){
cin>>n;while(n%2==0){
n /=2;}if(n !=1){
cout<<"YES"<<endl;}else{
cout<<"NO"<<endl;}}return0;}
B. New Year’s Number
题意:给定n,问能不能把n拆成 x*2020+y*2021的形式。
思路:原题可以看成是 n = (x+y)*2020 + y, y是余数。 x+y = n/2020。
AC代码:
#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;//const int mod = 1e9+7;constint mod =998244353;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];int sel =0;int sum =0;int maxx =0;signedmain(){int t;
cin>>t;while(t--){
cin>>n;int cnt = n/2020;int rem = n%2020;if(cnt >= rem){
cout<<"Yes"<<endl;}else{
cout<<"No"<<endl;}}return0;}
#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];
map<int,int> mp1,mp2;
map<pair<int,int>,int> mp3;signedmain(){
cin>>t;while(t--){
cin>>n>>m>>k;
mp1.clear(),mp2.clear(),mp3.clear();for(int i =0; i < k ; i ++) cin>>a[i],mp1[a[i]]++;for(int i =0; i < k ; i ++) cin>>b[i],mp2[b[i]]++,mp3[{a[i],b[i]}]++;int res =0;for(int i =0; i < k ; i ++){
res +=(k)-mp1[a[i]]-mp2[b[i]]+mp3[{a[i],b[i]}];}
cout<<res/2<<endl;}return0;}
#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];
map<int,int> mp1,mp2;
map<pair<int,int>,int> mp3;int sum1[200005]={0};int sum2[200005]={0};signedmain(){
cin>>t;while(t--){
cin>>n>>m;
vector<int> v1;
vector<int> v2;for(int i =0; i < n ; i ++){
cin>>a[i];}for(int i =0; i < n ; i ++){
cin>>b[i];if(b[i]==1) v1.push_back(a[i]);else v2.push_back(a[i]);}sort(v1.begin(),v1.end(),greater<int>());sort(v2.begin(),v2.end(),greater<int>());for(int i =1; i <= v1.size(); i ++){
sum1[i]= v1[i-1]+sum1[i-1];}for(int i =1; i <= v2.size(); i ++){
sum2[i]= v2[i-1]+sum2[i-1];}int res =1e18;for(int i =0; i <= v1.size(); i ++){int now = sum1[i];int need = m-now;int pos =lower_bound(sum2,sum2+v2.size()+1,need)-sum2;if(pos < v2.size()+1){
res =min(res,i+2*(pos));}}if(res <1e9) cout<<res<<endl;else cout<<-1<<endl;}return0;}
E. Advertising Agency
题意:n个博主。每个人有不同的粉丝数量。现在要和k个博主签合同。希望总的粉丝数量最大。求总方案数。
思路:贪心的去想。肯定是先选大的。前面比较大的都没得方案,全选就行了。对于最后刚好到达k时的值就是可以选择的值。比如在[1 3 1 2]选择3个,3和2,肯定是必选的。所以只能在 两个1里面选择1个。方案数就是
C
2
1
C_{2}^{1}
C21,2。综上,假设最后选择的值是x。数组中有m个x。现在去点选择x 的数量,剩下还需要再选y个人。也就是在m个人里面选y个。答案为
C
m
y
C_{m}^{y}
Cmy,因为n比较小。直接暴力算组合数就好了。
AC代码:
#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N],b[N];
map<int,int> mp1,mp2;
map<pair<int,int>,int> mp3;int sum1[200005]={0};int sum2[200005]={0};intcal(int x,int y){int res =1;for(int i =0; i < y ; i ++){
res =(res*x)%mod;
x -=1;}return res;}intqpow(int a,int b){int res =1;int tmp = a;while(b){if(b&1) res =res*tmp %mod;
b>>=1;
tmp = tmp*tmp%mod;}return res;}signedmain(){
cin>>t;while(t--){
cin>>n>>m;
map<int,int> mp;for(int i =0; i <n ; i ++) cin>>a[i],mp[a[i]]++;sort(a,a+n,greater<int>());int last = a[m-1];int need = m;for(int i =0; i < n ; i ++){if(a[i]== last)break;
need --;}int res =(cal(mp[last],need)*qpow(cal(need,need),mod-2))%mod;
cout<<res<<endl;}return0;}
#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[1005][1005],b[1005][1005];
string s1[N];
string s2[N];signedmain(){
cin>>t;while(t--){
cin>>n;
m = n;for(int i =0; i < n ; i ++){
cin>>s1[i];for(int j =0; j < m ; j ++){
a[i][j]= s1[i][j]-'0';}}for(int i =0; i < n ; i ++){
cin>>s2[i];for(int j =0; j < m ; j ++){
b[i][j]= s2[i][j]-'0';}}for(int i =0; i < n ; i ++){if(a[i][0]!= b[i][0]){for(int j =0; j < n; j ++){
a[i][j]^=1;}}if(a[0][i]!= b[0][i]){for(int j =0; j < n; j ++){
a[j][i]^=1;}}}int res =1;for(int i =0; i < n ; i ++){for(int j =0; j < m ; j ++){if(a[i][j]!= b[i][j]){
res =0;}}}puts(res ?"YES":"NO");}return0;}
#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =3e5+7;int n,m,k,t =1,cas =1;int a[N];int dp[N];signedmain(){
cin>>t;while(t--){
cin>>n;
map<int,int> mp;int maxx =0;for(int i =0; i < n ; i ++){
cin>>a[i];
mp[a[i]]++;
maxx =max(maxx,a[i]);}for(int i =1; i <= maxx; i ++) dp[i]=0;int res =0;for(int i =1; i <= maxx; i ++){
dp[i]+= mp[i];for(int j = i*2; j <= maxx ; j += i){
dp[j]=max(dp[j],dp[i]);}
res =max(res,dp[i]);}
cout<<n-res<<endl;}return0;}
A. Odd Divisor题意:判断n有没有奇数因子思路:签到题。只有2的幂次没有奇数因子。所以一直除2就行了。AC代码:#include <iostream>#include <bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusing namespace std;const double eps = 1e-10;//const int mod = 1e9+7;