Codeforces Round #741 div.2 A-F题解

Posted 欣君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #741 div.2 A-F题解相关的知识,希望对你有一定的参考价值。

视频讲解:TBD

A. The Miracle and the Sleeper

题目大意

给定两个正整数 l , r   ( 1 ≤ l ≤ r ≤ 1 0 9 ) l,r~(1 \\leq l \\leq r \\leq 10^9) l,r (1lr109) ,求满足 r ≥ a ≥ b ≥ l r \\ge a \\ge b \\ge l rabl 的最大的 $a \\mod{b} $ 。

题解

l l l 足够小,那么 a a a 应该取 r r r b b b 应该取 ⌊ r + 1 2 ⌋ \\lfloor \\frac{r+1}{2} \\rfloor 2r+1 ,答案为 ⌊ r − 1 2 ⌋ \\lfloor \\frac{r-1}{2} \\rfloor 2r1
l l l 较大,那么 a = r , b = l a=r,b=l a=r,b=l ,答案为 r m o d    l r\\mod{l} rmodl
分界点为 ⌊ r + 1 2 ⌋ \\lfloor \\frac{r+1}{2} \\rfloor 2r+1

参考代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int T,l,r;
	cin>>T;
	while(T--)
	{
		cin>>l>>r;
		if(l<=(r+1)/2)
			cout<<(r-1)/2<<endl;
		else
			cout<<r-l<<endl;
	}
}

B. Scenes From a Memory

题目大意

给定一个十进制下不包含 0 0 0 的整数 n ( 1 ≤ n < 1 0 50 ) n(1 \\le n < 10^{50}) n(1n<1050) ,删除最多的数字,使其变为非素数。

给定数据保证有解,若有多组解则输出任意一种即可。

题解

若包含 1 , 4 , 6 , 8 , 9 1,4,6,8,9 1,4,6,8,9 之一,则直接输出一位数即可。
若包含 2 , 5 2,5 2,5 之一且不为首位,则直接输出首位与 2 2 2 5 5 5 即可。
若包含两个 3 , 7 3,7 3,7 ,则直接输出 33 33 33 77 77 77 即可。
剩余只有 37 , 73 , 237 , 273 , 537 , 573 37,73,237,273,537,573 37,73,237,273,537,573 这几种情况。由于保证必定有解,因此不存在 37 , 73 37,73 37,73 这两种无解情况。对于剩余四种情况,显然 27 27 27 57 57 57 合法。

因此,答案必定为二位数,可以通过上述方式分类讨论,也可以直接枚举得到。

参考代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int T,sum[15],pos[15],i,j,k,flag;
	char s[55];
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&k);
		scanf("%s",&s);
		memset(sum,0,sizeof(sum));
		for(i=0;i<k;i++)
		{
			sum[s[i]-'0']++;
			pos[s[i]-'0']=i;
		}
		if(sum[1])
			printf("1\\n1\\n");
		else if(sum[4])
			printf("1\\n4\\n");
		else if(sum[6])
			printf("1\\n6\\n");
		else if(sum[8])
			printf("1\\n8\\n");
		else if(sum[9])
			printf("1\\n9\\n");
		else if(sum[2]&&pos[2]!=0)
			printf("2\\n%c2\\n",s[0]);
		else if(sum[5]&&pos[5]!=0)
			printf("2\\n%c5\\n",s[0]);
		else if(sum[3]>1)
			printf("2\\n33\\n");
		else if(sum[7]>1)
			printf("2\\n77\\n");
		else
		{
			flag=1;
			for(i=0;i<k&&flag;i++)
			{
				for(j=i+1;j<k;j++)
				{
					if((s[i]-'0'+s[j]-'0')%3==0)
					{
						printf("2\\n%c%c\\n",s[i],s[j]);
						flag=0;
						break;
					}
				}
			}
		}
	}
}

C. Rings

题目大意

有一个长度为 n   ( 2 ≤ n ≤ 2 ⋅ 1 0 4 ) n~(2 \\leq n \\leq 2\\cdot 10^4) n (2n2104) 仅由01构成的字符串 s s s

定义函数 f f f 表示将字符串视为二进制数后再转为十进制数的结果,例如 f ( 001010 ) = 10 f(001010)=10 f(001010)=10

你需要找到满足以下条件的两对整数 ( l 1 , r 1 ) , ( l 2 , r 2 ) (l_1,r_1),(l_2,r_2) (l1,r1),(l2,r2)

  • 1 ≤ l 1 ≤ n , 1 ≤ r 1 ≤ n , r 1 − l 1 + 1 ≥ ⌊ n 2 ⌋ 1 \\leq l_1 \\leq n,1 \\leq r_1 \\leq n,r_1-l_1+1\\geq \\lfloor \\frac{n}{2} \\rfloor 1l1n,1r1n,r1l1+12n
  • 1 ≤ l 2 ≤ n , 1 ≤ r 2 ≤ n , r 2 − l 2 + 1 ≥ ⌊ n 2 ⌋ 1 \\leq l_2 \\leq n,1 \\leq r_2 \\leq n,r_2-l_2+1\\geq \\lfloor \\frac{n}{2} \\rfloor 1l2n,1r2n,r2l2+12n
  • 存在非负整数 k k k ,满足 f ( s [ l 1 : r 1 ] ) = f ( s [ l 2 : r 2 ] ) ⋅ k f(s[l_1:r_1])=f(s[l_2:r_2])\\cdot k f(s[l1:r1])=f(s[l2:r2])k

题解

由于是二进制下截取子串,因此考虑 k = 2 k=2 <

以上是关于Codeforces Round #741 div.2 A-F题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #741 Div. 2 A B C D1 D2

Codeforces Round #741 Div. 2 A B C D1 D2

Codeforces Round #741 div.2 A-F题解

Codeforces Round #741 Div. 2 A B C D1 D2

Codeforces Round #741 (Div. 2) ABCD1D2题解

Codeforces Round #741 (Div. 2) ABCD1D2题解