1. 程式人生 > 實用技巧 >米酷CMS 7.0.4程式碼審計

米酷CMS 7.0.4程式碼審計

原題連結: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,使得pmodx=0pmodx=0並且xmodq0xmodq≠0.一個數學問題。

首先,如果pmodq0pmodq≠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