Codeforces Round #697 (Div. 3)-多一些不为什么的坚持

Codeforces Round #697 (Div. 3)

https://codeforces.ml/contest/1475

A. Odd Divisor

A题上去被卡了,老弱了。(一开始直接暴力枚举n的因子没看到n的范围结果直接T了)
n分三种情况:
如果n是1则不满足要求,输出“NO”即可;
如果n是奇数则必存在一个大于1的奇数因子(自己),故直接输出"YES";
如果n是偶数则一直除以2直到出现奇数或1为止。

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 
 
const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=2e5+7;
const ll mod=1e9+7;   
 
int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){
        ll n;cin>>n;
        if(n==1)cout<<"NO"<<endl;
        else if(n%2)cout<<"YES"<<endl;
        else{
            int flag=0;
            while(n%2==0&&n>1)n/=2;
            if(n%2&&n>1)cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
    return 0;
}

B. New Year's Number

求一个数是否可以由a个2020和b个2021相加得到,直接判断n/2020和n%2020的大小即可,因为n%2020就是2021的个数,如果n%2020 > n/2020,则必无解

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 
 
const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=5e5+7;
const ll mod=1e9+7;   

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        ll k=n/2020;
        ll p=n%2020;
        if(p>k)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}

C. Ball in Berland

求可以同时出现的对数。
因为每对只出现一次,所以将男孩、女孩的标号出现次数记录下来,当遍历到i时,首先a[i]和b[i]的次数减1,此时出现次数即为i后面出现的对数,所以i的贡献就是i后面的总对数减去a[i]和b[i]的出现次数.

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 
 
const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=2e5+7;
const ll mod=1e9+7;   
 
int a[N],b[N];
map<int,int>v1,v2;
 
int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){
        int n,m,k;
        cin>>n>>m>>k;
        v1.clear();
        v2.clear();
        for (int i = 1; i <= k; ++i)
        {
            cin>>a[i];
            v1[a[i]]++;
        }
        for (int i = 1; i <= k; ++i)
        {
            cin>>b[i];
            v2[b[i]]++;
        }
        ll ans=0;
        for (int i = 1; i < k; ++i)
        {
            v1[a[i]]--;
            v2[b[i]]--;
            ans+=k-i-(v1[a[i]]+v2[b[i]]);
        }cout<<ans<<endl;
    }
    return 0;
}

E. Advertising Agency

题意为求取得最大值的种树
去重后直接从大到小排序,依次取数直到k取完为止,在k最后一次取数时如果此时元素个数比需要取的个数大,则由组合数学可算出有多少种取法。
(注意需要乘法逆元)

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 
 
const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=2e5+7;
const ll mod=1e9+7;   
 
ll ksm(ll x,ll y){
    ll p=1;
    while(y){
        if(y&1)p=p*x%mod;
        x=x*x%mod;
        y>>=1;
    }return p%mod;
}
 
struct $
{
    ll a,b;
    ll sub;   
}arr[N];
 
map<ll,int>mp;
bool cmp1(ll x,ll y){
    return x>y;
}
bool cmp2($ x,$ y){
    if(x.sub==y.sub)return x.b<y.b;
    else return x.sub>y.sub;
}
 
ll f[1007];
 
int main(){ 
    IO;
    int t=1;
    cin>>t;
    f[0]=1;
    for (int i = 1; i < 1001; ++i)
    {
        /* code */f[i]=f[i-1]*i%mod;
    }
    while(t--){
        ll n,k;
        cin>>n>>k;
        map<int,int>mp;
        vector<int>v;
        for (int i = 0; i < n; ++i)
        {
            ll x;
            cin>>x;
            if(!mp[x])v.push_back(x);
            mp[x]++;
        }
        sort(v.begin(),v.end(),cmp1);
        ll ans=1;
        for(auto i : v){
            if(k<mp[i]){
                ans=((f[mp[i]]*ksm(f[mp[i]-k],mod-2)%mod)*ksm(f[k],mod-2)%mod)*ans%mod;
            }
            k-=mp[i];
            if(k<=0)break;
        }
        cout<<ans<<endl;
    }
    return 0;
}

只做了4道,可能是被今晚的cf搞崩心态了,一直交不上去。

继续努力!!!

posted @ 2021-01-26 01:26  !^^!  阅读(72)  评论(0)    收藏  举报