2020牛客暑期多校訓練營(第六場)解題報告
阿新 • • 發佈:2020-07-29
C
溫暖的簽到題。找到答案最大的一列即可,因為如果有多列的話,一定可以分為兩個行數不變的矩陣,其中一個答案一定不會變壞。我一開始還以為是0/1分數規劃
#include <bits/stdc++.h> using namespace std; #define ll long long ll input(){ ll x=0,f=0;char ch=getchar(); while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return f? -x:x; } const int N=207; double a[N][N]; int main(){ int T=input(); while(T--){ int n=input(),m=input(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=input(); double Ans=0; for(int j=1;j<=m;j++){ double tmp=0; for(int i=1;i<=n;i++){ tmp+=a[i][j]; Ans=max(Ans,tmp/a[i][j]); } } printf("%.8lf\n",Ans); } }
B
看樣例解釋易猜答案滿足:
\[f(n)=\frac{\prod_{i=1}^n(2^i-1)}{2^i} \]
#include <bits/stdc++.h> using namespace std; #define ll long long ll input(){ ll x=0,f=0;char ch=getchar(); while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return f? -x:x; } const int mod=1e9+7; const int N=2e7+10; ll powmod(ll a,ll b){ ll res=1; while(b){ if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } ll fz[N],ans[N],fm[N]; void init(){ fz[1]=2; fm[1]=powmod(2,mod-2); for(int i=2;i<N;++i){ fz[i]=fz[i-1]*2%mod; fm[i]=fm[i-1]*fm[1]%mod; } ans[1]=fm[1]; for(int i=2;i<N;++i){ ll tmp=(fz[i]-1+mod)%mod*fm[i]%mod; ans[i]=ans[i-1]*(fz[i]-1)%mod*fm[i]%mod ; } for(int i=2;i<N;++i) ans[i]=ans[i-1]^ans[i]; } int main(){ init(); int T=input(); while(T--){ int n=input(); printf("%lld\n",ans[n]); } }
G
血虧題(賽後三分AC)。隨意構造,按順序依次填k種顏色是ok的。例如有3種顏色,填色方案如圖:
不過要注意特判,顏色的數量要是\(2*(n+1)*n\)的約數,並且\(k=1\)和\(n=1\)時都沒有答案。(我就是沒判\(n==1\)疼失AC