首页 > 其他分享 >题解 Codeforces 1994H Fortnite

题解 Codeforces 1994H Fortnite

时间:2024-07-19 22:18:15浏览次数:9  
标签:std cout 题解 texttt Codeforces 1994H leq base 减去

首先第一次询问肯定是问 \(\texttt{aa}\),答案减去 \(1\) 得到基数 \(p\)。

然后我们随意询问一个真实 Hash 值(取模之前)\(X\) 大于模数 \(m\) 的字符串,例如 \(s=\texttt{zzz}\cdots\texttt{zzz}\)(\(50\) 个 \(\texttt z\))。设它取模得到的 Hash 值是 \(a\)。

考虑正整数 \(1 \leq b \leq a+1\)。注意到 \((X-a-b) \bmod m= ((X-a) \bmod m + (m-b)) \bmod m = m-b\),因为 \(a < m\)。

这一步注意力非常集中!

那么我们只要能找到 Hash 值在 \([X-1-2a,X-1-a]\) 之间的字符串就结束了。

首先将 \(s_1\) 减去 \(1\),并令 \(b\) 为 \(1\)。然后从低到高遍历 \(s\) 的每一位,并计算 \(a\) 在这一位上的大小 \(v\)。

如果 \(v\) 不超过 \(24\),那么 \(s\) 的这一位必然可以减去 \(v\),因为 \(s_i\) 最开始是 \(\texttt{z}(26)\),就算之前被减去了 \(1\),还剩下 \(25\)。

如果 \(v\) 超过了 \(24\),那么 \(s\) 的下一位减去 \(1\),这样会让 \(b\) 增加 \((p-v)\times W\),其中 \(W\) 是这一位的位权。

我们注意到 \(p \leq 50\),因为 \(p-v \leq 25\),从而当 \(v = 25\) 的时候 \((p-v) \times W\) 取得最大值 $ = 25W$。因此,就算这个过程中 \((p-v) \times W\) 一直取得最大值,\(b\) 在这个过程中也不会增加一个超过 \(a\) 的量,因此 \(b\) 最多为 \(a+1\),这使得我们的构造成立。

# include <bits/stdc++.h>

const int N=100010,INF=0x3f3f3f3f;

inline void solve(void){
	std::cout<<"? aa"<<std::endl;
	int p;
	std::cin>>p;
	--p;
	
	std::string s(50,'z');
	std::cout<<"? "<<s<<std::endl;
	
	int a,b=1;
	std::cin>>a;
	--s[0];
	for(long long i=0,base=1;a>=base;++i,base*=p){
		int v=(a/base)%p;
		if(v<=24) s[i]-=v;
		else --s[i+1],b+=base*(p-v);
	}
	std::cout<<"? "<<s<<std::endl;
	int c;
	std::cin>>c;
	std::cout<<"! "<<p<<" "<<b+c<<std::endl;
	return;
}

int main(void){
	int T;
	std::cin>>T;
	while(T--) solve();
	return 0;
}

标签:std,cout,题解,texttt,Codeforces,1994H,leq,base,减去
From: https://www.cnblogs.com/Meatherm/p/18312479

相关文章

  • CF466E Information Graph 题解
    题目链接LuoguCodeforces题意简述某公司中有\(n\)名员工。为方便起见,将这些员工从1至\(n\)编号。起初,员工之间相互独立。接下来,会有以下\(m\)次操作:员工\(y\)成为员工\(x\)的上司。保证此前\(x\)没有上司。员工\(x\)拿到一份文件并签字,随后交给他的上司......
  • P3206 城市建设 题解
    Statement动态边权的最小生成树。\(n\le2\cdot10^4,m,q\le5\cdot10^4\)Solution法一:改边权相当于删一条边再加一条边.考虑LCT维护最小生成树,加边好做,但删边比较麻烦,于是采用线段树分治,撤销一条边是好做的,cut再link一下就行了.\(O(n\logn\logq)\),常数较大.法二:两个结......
  • 07-19 题解
    07-19题解B思路实质:有一个完全图,删掉一些边,然后在图上找一棵生成树但是图的边数是\(n^2\)级别的,极其稠密找生成树的步骤:从一个点开始,把与它相连的,不在同一连通块的点连在一起所以我们只要确保每次都能在尽量少的步数内找到一个合法点一共有n个点,确定一个点之......
  • CodeForces - 1139D
    题目大意序列每次随机添加一个\([1,m]\)的整数,直到序列\(gcd=1\)停止,求期望操作次数。分析模拟过程发现只关心整个序列的\(gcd\)与下一次会添加什么,那么根据期望\(dp\)套路可得状态\(f_{i}\)表示当前序列\(gcd=i\),期望还操作多少次使得\(gcd=1\)。考虑枚举下一个......
  • 2024年牛客暑期多校训练营1 A题 A Bit Common题解
    题目的大意:首先,给你一个长度为n的序列A,A序列中每一个元素全都小于2m,并且大于等于0。A序列要满足存在一个非空子序列的与运算(&)和为1;输出这样的A序列有几个,最后对正整数q取模。(1<=n,m<=5000,1<=q<=109)输入只有一行n,m,q,输出包含一个整数。 题解:要满......
  • Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
    A直接速通就好了,我第一眼看的时候以为是整个数组可以有重复的数字,后面发现是保证没有的,所以直接随便交换一下位置就结束了。B,很经典的CF题,随便推导一下就能够发现,如果我想要一个位置能够发生变化,那么唯一的要求就是他以及他前面的位置有1出现过。而且完全不需要考虑为了一个数字......
  • [NOI2007] 项链工厂 题解
    前言题目链接:洛谷;Hydro&bzoj。题意简述yzh喜欢写DS题!你要维护一个环:顺时针移动\(k\)位;翻转\(2\simn\);交换\(i\)与\(j\);区间覆盖;查询整个环有几个颜色段;查询\(i\simj\)有几个颜色段。题目分析平衡树板子啊,代码很好写,\(273\)行。但是为什么不使用线......
  • 1004:字符三角形 题解
    题目链接题目描述给定一个字符,用它构造一个底边长\(5\)个字符,高\(3\)个字符的等腰字符三角形。解题思路由于是字符,我们需要定义一个char类型的字符变量。第一行为两个空格和一个字符第二行为一个空格和三个字符第三行是五个字符输出即可ACCode#include<bits/stdc++.h......
  • 1003:对齐输出 题解
    题目链接题目描述读入三个整数,按每个整数占\(8\)个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。解题思路由于我们不知道这个数有多大,所以我们可以用printf自带的占位符%xd输出,其中x为位数。例:printf("%3d",a);就是占用3位。题目要求为\(8\)位......
  • 1001:Hello,World! 题解
    题目链接题目描述编写一个能够输出“\(\mathtt{Hello,World!}\)”的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。提示:“\(\mathtt{Hello,World!}\)”中间没空格。解题思路梦开始的地方\(Ver3.0\)没......