2021牛客暑期多校训练营8,签到题ADEK

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021牛客暑期多校训练营8,签到题ADEK相关的知识,希望对你有一定的参考价值。

题号 标题 已通过代码 通过率 团队的状态
A Ares, Toilet Ares 点击查看 1035/5027 通过(分数相加取模,求逆元)
B Dohna Dohna 点击查看 5/72 未通过
C Fuzzy Graph 点击查看 4/28 未通过
D OR 点击查看 632/3372 通过(位运算,枚举)
E Rise of Shadows 点击查看 1636/1930 通过(素数,闰年)
F Robots 点击查看 125/1573 未通过
G rsrams 点击查看 2/24 未通过
H Scholomance Academy 点击查看 12/39 未通过
I The Grand Tournament 点击查看 4/24 未通过
J Tree 点击查看 119/1321 未通过
K Yet Another Problem About Pi 点击查看 999/8845 通过(找规律贪心,暴力枚举)

A Ares, Toilet Ares

题意:

  • 巨长的阅读理解,输出n个分数相加的和%4523。
    思路:
  • 开局榜歪了,后来才发现,直接n个分数相加输出就行,有大约一半的变量是没有用的。分数取模注意一下求逆元做除法即可。
  • 取模没有(+mod)%mod错了一次改了好久,这个错失误了好多次了,要记住、
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const LL mod = 4933;

LL pows(LL a, LL x, LL p){if(x==0)return 1; LL t = pows(a, x>>1,p);if(x%2==0)return t*t%p;return t*t%p*a%p;}
LL inv(LL x, LL p){ return pows(x,p-2,p);}

int main(){
	LL n,m,k,a,l;
	cin>>n>>m>>k>>a>>l;
	LL ans = 1;
	for(int i=1; i <= k; i++){
		int x, y, z;  cin>>x>>y>>z;
		if(x!=0)(ans *= (1-y*inv(z,mod)%mod+mod)%mod)%=mod;
	}
	ans = (ans+a%mod+mod)%mod;
	cout<<ans<<"\\n";
	return 0;
}

D OR

题意:

  • 给出两个长为n-1的序列b和c,定义bi=(ai | a_i-1), ci=(ai + a_i-1),求满足该条件的a序列有多少可能。

思路:

  • 知道一个性质a+b==a&b+a|b,所以已知bi, ci, 那么定义di= (ai & a_i-1) = ci-bi。
  • 然后注意到,已知a1的取值能够确定整个序列,可以由ci直接累加计算,也可以由位运算另一条性质a+b==a^b+2(a&b)异或计算。
  • 因此,考虑每一位分开来考虑,然后枚举a1的取值即可。 复杂度O(n loga)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int b[maxn], c[maxn], d[maxn];
int main(){
	int n;  cin>>n;
	for(int i=2; i<= n; i++)cin>>b[i];
	for(int i=2; i<= n; i++)cin>>c[i],d[i]=c[i]-b[i];
	int ans = 1;
	for(int i=0; i< 31; i++){
		int x=1, y=1; //表示上一位能不能取0,1
		for(int j=2; j<=n; j++){ //枚举a1取值的限制情况
			int w1=(b[j]>>i)&1, w2=(d[j]>>i)&1;//表示|和&两种情况
			if(w2==1 &&w1==1)x=0;//&==1,|==1,当前位0不能取
			if(w2==0 &&w1==1)swap(x,y);//当前位和上一位相反
			if(w2==0 &&w1==0)y=0;//&==0,|==0,当前位1不不能取
			if(w2==1 &&w1==0)x=0,y=0;//&==1,|==0,冲突了都不能取
		}
		ans *= (x+y);//最后一位能不能取0,1
	}
	cout<<ans<<"\\n";
	return 0;
}

E Rise of Shadows

题意:

  • 给出一个数,判断它是否同时满足闰年和素数两个条件。

思路:

  • 注意到1e7不可以用筛法预处理,直接条件判断闰年,试除法判断素数即可,可以通过。
#include<bits/stdc++.h>
using namespace std;

int is_prime(int x){
	if(x==1)return false;
	if(x==2)return true;
	for(int i =2; i*i <= x; i++){
		if(x%i==0)return false;
	}
	return true;
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T;  cin>>T;
	while(T--){
		int x;  cin>>x;
		if(((x%100!=0&&x%4==0) ||(x%400==0) ) &&is_prime(x))cout<<"yes\\n";
		else cout<<"no\\n";
	}
	return 0;
}

  • 再注意到闰年一定 需要%4==0或%400==0,所以一定不可能是素数,直接输出no即可,两行就可以通过。
#include<cstdio>
int main(){int T;scanf("%d",&T);while(T--)puts("no");}

K Yet Another Problem About Pi

题意:

  • 给出w和d,竖着的经线每w一条,横着的纬线每d一条,可以从任意点出发沿着任意方向走π米,求最多能路过多少个方格。

思路:

  • 考虑到可以贴着线走,意味着我们总有空间在格点附近以无限小来回横跳, 即约等于包括所有两边的方格,所以走到哪前面能范围内的方格就可以计入。
  • 然后注意到网格线每走一段,新经过区域为 2,对角线每走一段,新经过区域为3。但是对角线比网格线要长,令a=min(w, d), b = sqrt(w*w+d*d), 所以答案即为求解满足ax+by<=π时 2x+3y的最大值
  • 注意到w, d的范围只有5, π也只有3,所以可暴力枚举x和y的值,满足条件时用2x+3y+4更新答案即可(+4是刚开始走的区域的四个格子)
#include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T;  cin>>T;
	while(T--){
		double w, d;  cin>>w>>d;
		double a=min(w,d), b=sqrt(w*w+d*d);
		int ans = 0;
		for(int x=0; x<=100 &&a*x<=pi ; x++)//横着走x步,ax<=pi
			ans =max(ans, 2*x+3*int((pi-a*x)/b)+4);
		for(int y=0; y<=100 &&b*y<=pi ; y++)//斜着走y步, by<=pi
			ans =max(ans, 2*int((pi-b*y)/a)+3*y+4);
		cout<<ans<<"\\n";
	}
	return 0;
}

以上是关于2021牛客暑期多校训练营8,签到题ADEK的主要内容,如果未能解决你的问题,请参考以下文章

2021牛客暑期多校训练营9,签到题HE

2021牛客暑期多校训练营1, 签到题DFBG

2021牛客暑期多校训练营2,签到题CDFKI

2021牛客暑期多校训练营7,签到题FHI

2021牛客暑期多校训练营6,签到题CFHI

2021牛客暑期多校训练营5,签到题BDHJK