【发布时间】:2023-03-16 02:12:01
【问题描述】:
最近我正在解决以下problem on codechef:
爱丽丝最近和大厨吵架了。所以 Chef 给 Alice 一个问题。 最初,您会得到一个空字符串,并且可以进行两次操作。
Operation-1:每个“a”变成“c”,每个“c”变成“a”。例如,“acc”变为“caa”。
Operation-2: 字符串反转。例如,“acc”变成“cca”。厨师给出以下生成方程 SN = SN-1 + "a" + Operation-1(Operation-2(SN-1))
其中 S0 = ""(空字符串)。
Alice 很容易找出接下来的几个序列:
S1 = "a"
S2 = "aac"
S3 = "aacaacc"现在 Chef 要求查找 SLOC 的第 K 个字符,其中 LOC = 102017。你需要帮助爱丽丝找到答案。
1 ≤ T ≤ 100
1≤K≤1018
我已尝试使用以下代码解决问题:
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&k);
count=0;
while(1)
{
lg=(double)log(k)/log(2);
av=pow(2,lg);
if(av!=k)
{
diff=k-av;
k=av-diff;
count++;
}
else
{
if(count%2==0)
{
printf("a\n");
}
else
{
printf("c\n");
}
break;
}
}
}
解决方案有什么问题?
我尝试了各种输入并得到了正确答案,但是当我提交时我得到了 WA。谁能提供一些解决方案失败的测试用例。
【问题讨论】:
-
您检查过大 k 的数值不准确吗?对于大 k 来说,它似乎不太可能完全等于
pow(2, double(log(k)/log(2)))。 -
例如当k是
1ULL<<29 -
是的,即使 k=10^18 也给出了正确的答案
-
另外——你的代码不完整。 diff和av的类型有哪些?
-
我只分享了一段代码。所有变量都是 long long int
标签: algorithm