2021暑期牛客多校训练8

E-Rise of Shadows

题意:

判断所给年份是否是闰年并且是质数

思路:

润年的判断方法:能被4整除不能被100整除或者能被400整除

由此可知:所有的闰年都不是质数

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e6+5;
int t,tem;
int main() {
	cin>>t;
	while(t--){
		cin>>tem;
		cout<<"no"<<endl;
	}
    return 0;
}

K-Yet Another Problem About Pi

题意:

给定宽和高的平面方格,问经过π 路程最多可以经过多少个方格

思路:

首先,容易想到最少经过四个;

再仔细分析:只要经过一个点那么就可以以极小的代价(几乎可以忽略,因为π是无限不循环小数)访问该点临近的四个方格,那么问题就可以转化成尽可能多得过顶点;

这时容易想到沿着短的一边走;但还可以沿着对角线走;

沿着短的一边走:起点(4个)每经过一个点加2

沿着对角线走:起点(4个)每经过一个点加3

由此有两种贪心策略:

1、沿着短的一边走,走到最后一个顶点时,往后退一步看能否沿对角线走

2、沿着对角线走,走到最后一个顶点时:1.看剩余路程能否沿短的一边走 2.往后退一步看能否沿短的一边走两个顶点

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
#define fi first
#define se second
#define pb push_back
#define debug(x)   cout<<x<<endl
#define mem(a,b) memset((a),(b),sizeof(a))
const int mod=4933;
const double pi = acos(-1);
typedef double db;
#define pep(i,stl) for(auto i:stl)
const int N = 2e6+5;
int n,m;
int t;
int main() {
	double n,m;
	cin>>t;
	while(t--){
		int ans=4,tem=0,te=0;
		cin>>n>>m;
		db wid=min(n,m),len=sqrt(n*n+m*m);
		int t1=floor(pi/wid);
		if(t1){
			db left=pi-t1*wid+wid;
			if(left>len) tem=t1*2+1;
			else tem=t1*2;
		}
		t1=floor(pi/len);
		if(t1){
			db left=pi-t1*len;
			if(left>wid) te=t1*3+2;
			else if(left+len>2*wid) te=t1*3+1;
			else te=t1*3;
		}
		tem=max(te,tem);
		cout<<ans+tem<<endl; 
	}
    return 0;
}

D-OR

题意:

给定两个序列b,c; b i = a i − 1 ∣ a i , c i = a i − 1 + a i b_i=a_{i-1}|a_i,c_i=a_{i-1}+a_i bi=ai1ai,ci=ai1+ai求满足条件的序列a的个数

思路:

位运算的性质: a + b = a ∣ b + a & b a+b=a|b+a\&b a+b=ab+a&b

对于数组a,只要确定其中某一个数,则整个数组都可以确定

考虑 a 1 a_1 a1(考虑其他数也可以,这里以 a 1 a_1 a1为例):

二进制枚举:1.当前为1/0 2.即可为0又可为1

即假设 a i a_i ai的某一位为1/0,代入条件中判断是否成立,若成立则cnt++;

最后:ans*=cnt;

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-9
#define mem(a,b) memset((a),(b),sizeof(a))
const int N=1e6+1000;
typedef double db;
const int mod=1e9+7;
const double PI = acos(-1);
#define pep(i,stl) for(auto i:stl)
int n,m;
ll ans=1;
int b[N],c[N],a[N],d[N],h[N];
int main()
{
	cin>>n;
	rep(i,2,n) scanf("%d",&b[i]);
	rep(i,2,n) scanf("%d",&c[i]),c[i]-=b[i];
	rep(i,0,30){
		int t=1,cnt=0,flag=0;
		rep(j,2,n){
			int Or=b[j]>>i&1,And=c[j]>>i&1;
			if(!t&&And||!Or&&t){
				flag=1;break;
			} 
			else if(t) t=And;
			else t=Or;
		}
		if(!flag) cnt++;
		flag=0;
		t=0;
		rep(j,2,n){
			int Or=b[j]>>i&1,And=c[j]>>i&1;
			if(!t&&And||!Or&&t){
				flag=1;break;
			} 
			else if(t) t=And;
			else t=Or;
		}
		if(!flag) cnt++;
		ans*=cnt;
	}
	cout<<ans;
    return 0;
}

A-Ares, Toilet Ares

题意:

一场比赛有n道题,其中最简单的m道题你可以做出来,现在对于特定的某道题,你有k次机会获得该题的代码,每次获取 x i x_i xi行,每次获取的代码有 y z y\over z zy的概率是错的,求能做出几道题(答案对4933取模)

思路:

简单的概率论,注意对分母求逆元

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
#define fi first
#define se second
#define pb push_back
#define debug(x)   cout<<x<<endl
#define mem(a,b) memset((a),(b),sizeof(a))
const int mod=4933;
const double PI = acos(-1);
typedef double db;
#define pep(i,stl) for(auto i:stl)
const int N = 2e6+5;
int n,m,k,a,l;
int x,y,z,fenzi=1,fenmu=1;
bool b[N];
ll fastpow(ll x,ll y){
	x%=mod;
	ll ans=1;
	while(y){
		if(y&1) ans=ans*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return ans%mod;
}
int main() {
	cin>>n>>m>>k>>a>>l;
	while(k--){
		cin>>x>>y>>z;
		if(x) fenzi=fenzi*(z-y)%mod,fenmu=fenmu*z%mod;
	}
	cout<<(a%mod+fenzi*fastpow(fenmu,mod-2))%mod;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值