牛客多校8 补题

1.Rise of Shadows

E题链接: https://ac.nowcoder.com/acm/contest/11259/E
思路:是闰年就不可能是质数,所以不存在满足条件的年份。

代码如下

#include <bits/stdc++.h>
using namespace std;
int main(){
	int t,n;
	cin>>t;
	while(t--){
	 cin>>n;
	 puts("no");//不可能既是闰年又是质数
	}
	return 0;
}

2. Ares, Toilet Ares

A题链接:https://ac.nowcoder.com/acm/contest/11259/A

思路:由题意得,要计算概率,概率为a+ (z-y)/z的累乘值,再模上4933.那么此处就只需要求(z-y)/z的累乘值,转化为求逆元。
注意此处:x=0时是不计入的 。

涉及分数运算:首先想到求逆元!!!

所用知识:快速幂、费马小引理求逆元

代码如下:


#include <bits/stdc++.h>
using namespace std;
const int mod = 4933;
typedef long long ll;
ll n,m,k,a,l,x,y,z;
ll qk(ll a, ll b, ll mod){//快速幂 
	ll ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
int main(){
	cin>>n>>m>>k>>a>>l;
	ll ans=1; 
	for(int i=1;i<=k;i++){
		cin>>x>>y>>z;
		if(x){
			ans=ans*1ll*(z-y)*qk(z,mod-2,mod)%mod;//求逆元,累乘 
		}
	}
	cout<<(a+ans)%mod<<endl;
	return 0;
}

3.Yet Another Problem About Pi

[K题链接] https://ac.nowcoder.com/acm/contest/11259/K

题意:
在间距为w,d的网格中走Π的距离,最多经过多少个格子。

所用知识:
贪心,枚举,数学知识。

思路:
走直线的贡献为2,走斜线的贡献为3。并且走直线的时候,肯定沿着更短的一边走更优,
d1=min(w,d)
d2 = sqrt(ww+dd)

而一开始是从4开始扩展,设一共走了x条直线,y条对角线,那么最后经过的格子总数为
f(x,y) = 2x+3y+4
又要满足xd1+yd2<=Π
此处令y=(Π-xd1)/d2
那么就变为f(x)=2x+3
(Π-xd1)/d2+4
求导得:f’(x)=2-3
d1/d2
又因为导数表示的是变化率,所以走直线或者走斜线的变化最大值为2.
所以在0-2枚举

代码如下:

#include <bits/stdc++.h>
using namespace std;
double w,d,p,q,pi=acos(-1);
int t,ans;
int main(){
	cin>>t;
	while(t--){
		cin>>w>>d;
		p=min(w,d);//直线:贡献为2 
		q=sqrt(w*w+d*d);//斜线:贡献为3 
		ans=0;
		for(int i=0;i<=2;i++){//变化:最大是2,所以从0-2枚举 
			if(pi-i*p>0) ans=max(ans,(int)((pi-i*p)/q)*3+2*i);//直线 
			if(pi-i*q>0) ans=max(ans,(int)((pi-i*q)/p)*2+3*i);//斜线 
		}
		cout<<ans+4<<endl;
	}
	return 0;
} 

4.OR

[D题·链接] https://ac.nowcoder.com/acm/contest/11259/D

题意:
给出a[i-1] | a[i] 和a[i-1] +a[i]的序列,问a序列有多少种。

思路:
因为 b[i]=a[i-1] | a[i] , c[i]=a[i-1]+a[i].
那么由&运算:两个都为1才为1,即有0为0
|运算:有1为1
所以a[i-1]+a[i]=a[i-1] | a[i] + a[i-1] & a[i].
所以d[i]=a[i-1] & a[i] = b[i] - c[i].

所以只要求到了a[1],那么之后的都可以根据b[i]和d[i]递推出来,所以问题转化为枚举a[1]的每个二进制位,看有多少种可能。

设bit0,bit1表示为0,1的可能,如果为1:可以;为0:不可以。
nowbit0,nowbit1表示当前比特位为0,1的情况。
若b[i]和d[i]的对应位均为1,那么可以唯一确定nowbit1=bit1;
b[i]和d[i]的对应位均为0,那么可以唯一确定nowbit0=bit0;
b[i]对应位为1,d[i]对应位为0,那么nowbit1=bit0,nowbit0=bit1;
因为&:两个为1时为1,所以当d[i]=1时,b[i]不可能为0,所以不存在b[i]对应位为0,d[i]对应位为1的情况!
每次枚举完之后,累乘答案。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int b[N],c[N],n;
int main(){
	cin>>n;
	for(int i=2;i<=n;i++) cin>>b[i];//输入b[i] 
	for(int i=2;i<=n;i++){
		cin>>c[i];//输入c[i] 
		c[i]-=b[i];
	}
	//后面根据b[i]和c[i]反推a[i] 
	int ans=1;
	for(int i=0;i<=31;i++){
		int bit0=1,bit1=1;//初始默认前面0,1都可取 
		for(int j=2;j<=n;j++){
			int nowbit0=0,nowbit1=0;
			int x=b[j]>>i&1;//取出b[j]的第i位 
			int y=c[j]>>i&1;//取出c[j]的第i位 
			if(x&&y) nowbit1=bit1;//可以唯一确定1 
			if(x&&!y) nowbit1=bit0,nowbit0=bit1;//都行 
			if(!x&&!y) nowbit0=bit0;//可以唯一确定0 
			bit1=nowbit1,bit0=nowbit0;
		}
		ans*=(bit1+bit0);
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值