小白月赛76

A


你正在与长途玩石头剪刀布的猜拳游戏。


请回忆石头剪刀布的游戏规则:两个人同时伸出手,分别出示石头(用 shitou 表示)、剪刀(用jiandao 表示)或布(用 bu 表示)的手势。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出示的手势相同,则是平局,需要重新进行游戏。

在开始游戏之前,长途会告诉你他要出石头、剪刀还是布。

然而实际上,长途是在欺骗你。他认为你会相信他的话,并且认为你一定会根据他说的话选择能战胜他的手势(例如,他说他会出石头,他便认为你会出布)。

所以最终,长途不会按照他告诉你的手势出拳,而是选择自己所认为一定能战胜你的手势。

现在你已经看透了他的小心思。请问,在知道他告诉你他要出什么手势的情况下,你应该出什么手势才能取胜?

输入描述:

仅输入一行,包含一个字符串,表示长途告诉你的他要出的手势。保证字符串一定是 shitou,jiandao,bu 中的一个。

输出描述:

仅输出一行,包含一个字符串,表示最终你能取胜的手势。输出字母的大小写不限,例如 SHITOU,shitou ,sHitoU 都会被认定为石头。

示例1

输入

bu

 
   

输出

(狡猾的长途决定不提供样例输出。)

输出输入即可

#include
using namespace std;
#define int long long 
const int N=1e5+10;
string s;
signed main()
{
	cin>>s;
	
    cout<

 

B


 

氧气少年最近喜欢上了一。

氧气少年有一个文本输入框,最初文本输入框里只有一个字符 `1\tt 11'。


氧气少年每次可以进行下面的操作:
 

  •  选中文本输入框中的部分或全部字符,将选中的字符复制到剪贴板,然后立即将复制的内容粘贴到文本输入框末尾。


现在氧气少年想让文本输入框中恰好有 n 个 `1',请求出他需要做的最少的操作次数。

输入描述:

第一行包含一个整数 T(1≤T≤2⋅10^5),表示测试用例的组数。

对于每组测试用例:

仅输入一行,包含一个整数 n(1≤n≤10^9)。

输出描述:

对于每组测试用例:

仅输出一行,包含一个整数,表示答案。

示例1

输入

2
1
2

输出

0
1

 二进制计算

#include
using namespace std;
#define int long long 
const int N=1e5+10;
int a[100];
int T,n;
void init()
{
	a[0]=1;
	for(int i=1;i<=35;i++)
	{
		a[i]=a[i-1]*2;
	}
}
int solve(int n)
{
	int sum=0;
	for(int i=35;i>=0;i--)
	{
		if(n>a[i])
		{
			return i+1;
		}
		else if(n==a[i])
		{
			return i;
		}
	}
	return 0;
}
signed main()
{
	init();
	
	cin>>T;
	
	for(int i=1;i<=T;i++)
	{
		cin>>n;
		cout<

 

C


 

题目描述

给出两个整数 n 和 m,请你找出两个整数 a 和 b,并且 a 和 b 需要同时满足以下条件:

  •  a+b=n
  • a%mod b=m
  •  0≤a≤10^9,1≤b≤10^9

如果找不到合法的 a 和 b,输出 −1;否则请输出你找到的 a 和 b。如果有多个可行的答案,请输出任意一个。

输入描述:

第一行包含一个整数 T(1≤T≤2⋅10^5),表示测试用例的组数。

对于每组测试用例:

仅输入一行,包含两个整数 n,m (0≤n,m≤10^9)。

输出描述:

对于每组测试用例:

仅输出一行。如果找不到合法的 a 和 b,输出 −1;否则请输出两个整数 a 和 b。如果有多个可行的答案,请输出任意一个。

示例1

输入

2
6 2
1 1

输出

2 4
-1

构造题,我暴力做超时了

#include
using namespace std;
#define int long long 
const int N=1e5+10;
int T;
int n,m;
void solve()
{
	cin>>n>>m;
	int sum=n-m;
	if(sum<=0){
		cout<<-1<<"\n";
		return;
	}
	for(int i=1;i<=sqrt(sum);i++)
	{
		if(sum%i==0)
		{
			if(i>m&&i<=n)
			{
				cout<m&&t<=n)
			{
				cout<>T;
    while(T--){
    	solve();
	}
	return 0;
} 
//a=m+bk  a+b=n -->   m+b(k+1)=n   2+b(k+1)=6

 正解

#include
using namespace std;
#define int long long 
const int N=1e5+10;
int T;
int n,m;
void solve()
{
	cin>>n>>m;
    if(m*2>=n){
    	cout<<-1<<"\n";
	}
	else{
		cout<>T;
    while(T--){
    	solve();
	}
	return 0;
} 
//a=m+bk  a+b=n -->   m+b(k+1)=n   2+b(k+1)=6


 

月色哥哥手中有一个数字 x,最初 x=0。

给出一个长度为 n 的序列 a,月色哥哥会从序列的第一个元素 a1 按顺序看到序列的最后一个元素 an​。对于序列的第 i 个元素 ai​,月色哥哥可以进行下面的操作之一:
 

  •  令 x=x⋅ai
  •  令 x=x+ai


请求出 x 的最大值,并输出这个最大值除 998244353 的余数。

输入描述:

第一行包含一个整数 T(1≤T≤10^5),表示测试用例的组数。

对于每组测试用例:

第一行包含一个整数 n(1≤n≤2⋅10^5),表示序列的长度。

第二行包含 n 个整数 a1…an(0≤ai≤10^9),表示该序列。

保证对于所有的测试用例,n 的总和不超过 2⋅10^5。

输出描述:

对于每组测试用例:

仅输出一行,包含一个整数,表示答案。

示例1

输入

3
2
1 1
1
0
1
998244353

输出

2
0
0

前面注意x=0、1和a[i]=0、1     后面不用管x=0、1

#include
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
const int N=2e5+10;
int a[N];
int T;
int n;
const int mod=998244353;
void solve()
{
	cin>>n;
	fp(i,1,n){
		cin>>a[i];
	}
	
	int now=0;
	int num=n+1;
	
	fp(i,1,n){
		if(now<=1)now+=a[i];
		else{
			num=i;
			break;
		}
	}
	
	now%=mod;
	
	fp(i,num,n){
		if(a[i]==0||a[i]==1){
			now+=a[i];
			now%=mod;
		}
		else{
			now=now*a[i]%mod;
		}
	}
	cout<>T;
    while(T--){
    	solve();
	}
	return 0;
} 

 

你可能感兴趣的:(算法)