2020牛客暑期多校训练营(第六场)解题报告
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😭)
#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=407;
int h[N][N],L[N][N];
int main(){
int T=input();
while(T--){
int n=input(),k=input();
if(n==1||k==1){printf("-1\n");continue;}
if((2*(n+1)*n)%k) printf("-1\n");
else{
int now=0;
for(int i=1;i<=(n+1);i++){
for(int j=1;j<=(n+1);j++){
if(j==(n+1)) continue;
// cout<<"h:"<<i<<" "<<j<<endl;
h[i][j]=now+1;
now=(now+1)%k;
}
for(int j=(n+1);j>=1;j--){
if(i==(n+1)) continue;
L[j][i]=now+1;
now=(now+1)%k;
}
}
for(int i=1;i<=(n+1);i++)
for(int j=1;j<=n;j++){
printf("%d%c",h[i][j],j==n? '\n':' ');
}
for(int i=1;i<=(n+1);i++)
for(int j=1;j<=n;j++){
printf("%d%c",L[i][j],j==n? '\n':' ');
}
}
}
}