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; }
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; }
C - Division
有两个数pp和qq,找到一个最大的数xx,使得p mod x=0p mod x=0并且x mod q≠0x mod q≠0.一个数学问题。
首先,如果p mod q≠0p 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; }
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; }
还是不习惯写代码的时候加上空格,那就索性不加了吧。
2020.12.13 新生赛!=退役赛

浙公网安备 33010602011771号