Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)

原题链接:https://codeforces.com/contest/1445

A. Array Rearrangment

给定两个序列,判断a+b<=x,由于序列b可以排序,所以将两个序列都进行排序。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[60],b[60];
bool amp(int x,int y)
{
    return x>y;
}
bool cmp(int x,int y)
{
    return x<y;
}
int main()
{
    int t;
    cin>>t;
    int n,x;
    while(t--)
    {
        cin>>n>>x;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++) scanf("%d",&b[i]);
        sort(a+1,a+n+1,amp);
        sort(b+1,b+n+1,cmp);
        int pd=1;
        for(int i=1;i<=n;i++)
        {
            if(a[i]+b[i]>x)
            {
                cout<<"No"<<endl;
                pd=0;
                break;
            }
        }
        if(pd==1) cout<<"Yes"<<endl;
    }
    return 0;
}
View Code

B - Elimination

题目讲了一大堆,看不懂这波,又想起了某场比赛的迷惑行为,题干上居然还会讲故事,和题目毫不相关,和whs大佬研读了一个多小时,最终输出了一个2就过了。这道题目看两个最小值中的最大就好了。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int t;
    cin>>t;
    int a,b,c,d;
    while(t--)
    {
        cin>>a>>b>>c>>d;
        cout<<max(a+b,c+d)<<endl;
    }
    return 0;
}
View Code

C - Division

有两个数pp和qq,找到一个最大的数xx,使得p mod x=0p mod x=0并且x mod q0x mod q≠0.一个数学问题。

首先,如果p mod q0p mod q≠0,那么我们可以让x=px=p就行了,否则,就意味着,pp可以被qq整除,也就是说pp的质因子包含了qq的所有质因子,我们可以对qq进行质因子分解,我们要求的xx不能包含qq的所有质因子(带次数),然后可以去枚举qq的质因子,我们要让pp的质因子不包含qq的所有质因子,最佳的方法是,将pp中与qq枚举到的质因子的次数变为qq中枚举的减一即可,因为这样pp中与qq相同的质因子次数比qq的小,必然不能被qq整除,那么我们就可以让xx为现在的pp.

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
vector <long long> v;
int main()
{
    int t;
    cin>>t;
    long long p,q;
    while(t--)
    {
        v.clear();
        cin>>p>>q;
        if(p%q!=0) cout<<p<<endl;
        else
        {
            long long tmp=q,ans=-1;
            for(int i=2;i*i<=q;i++)
            {
                while(tmp%i==0)
                {
                    v.push_back(i);
                    tmp/=i;
                }
            }
            if(tmp>1) v.push_back(tmp);
            for(int i=0;i<v.size();i++)
            {
                tmp=p;
                while(tmp%q==0&&tmp%v[i]==0)
                {
                    tmp/=v[i];
                }
                ans=max(ans,tmp);
            }
            cout<<ans<<endl;
//            printf("%lld\n",ans);
        }
    }
    return 0;
}
View Code

D - Divide and Sum

这位大佬讲的很好,附上链接:https://www.cnblogs.com/Qing-LKY/p/CF1445D-solution.html

推断出规律来,然后用逆元+阶乘。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
const long long mod=998244353;
ll a[maxn];
ll b[maxn];
ll jc[maxn];
bool amp(int x,int y)
{
    return x<y;
}
int main()
{
    ll n;
    cin>>n;
    for(int i=1;i<=2*n;i++) scanf("%d",&a[i]);
    b[1]=b[0]=1;
    jc[1]=jc[0]=1;
    for(int i=2;i<=2*n;i++)
    {
        jc[i]=jc[i-1]*i%mod;
        b[i]=(mod-mod/i)*b[mod%i]%mod;
    }
    for(int i=1;i<=2*n;i++)
    {
        b[i]=b[i-1]*b[i]%mod;
    }
//    for(int i=1;i<=2*n;i++) cout<<b[i]<<" ";
//    cout<<endl;
    ll sum=jc[2*n]*b[n]%mod*b[n]%mod;
//    cout<<sum<<endl;
    sort(a+1,a+n+n+1,amp);
    ll ans=0;
//     for(int i=1;i<=2*n;i++) cout<<a[i]<<" ";
    for(int i=1;i<=n;i++)
    {
        ans=(ans-(sum*a[i]%mod))%mod;
    }
    for(int i=n+1;i<=2*n;i++)
    {
        ans=(ans+(sum*a[i]%mod))%mod;
    }
    cout<<(ans+mod)%mod;
    return 0;
}
View Code

 还是不习惯写代码的时候加上空格,那就索性不加了吧。
2020.12.13 新生赛!=退役赛

posted @ 2020-11-18 13:36  standard_zsz  阅读(136)  评论(0)    收藏  举报