米酷CMS 7.0.4程式碼審計
阿新 • • 發佈:2020-11-17
原題連結: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,intView Codey) { 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; }
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並且xmodq≠0xmodq≠0.一個數學問題。
首先,如果pmodq≠0pmodq≠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