F:给出两个字符串a,b。定义x ∞=xxx…,问: a ∞和b ∞按字典序比较的结果
1.我自己当时的思路
如果两个字符串的无限延伸相同,那么,这两个字符串一定有相同的循环节。(直觉)
所以,我取ab两字符串长度的gcd作为循环节长度,(如果存在循环节,那么gcd也一定是一个循环节)
特判完相等之后,o(n)比较不同就可以了。
#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string a,b;
while(cin >> a)
{
cin >> b;
int ans = 0;
int flag = 0;
int l = gcd(a.size(),b.size());
string s = "";
for(int i = 0; i < l; i++)
{
s += a[i];
}
for(int i = 0; i < a.size(); i++)
{
if(a[i] != s[i%s.size()])
{
flag = 1;
}
}
for(int i = 0; i < b.size(); i++)
{
if(b[i] != s[i%s.size()])
{
flag = 1;
}
}
if(flag == 0)
{
cout << "=" << endl;
continue;
}
for(int i = 0;;i++)
{
if(a[i%a.size()] == b[i%b.size()])
{
continue;
}
else
{
if(a[i%a.size()] > b[i%b.size()])
ans = 1;
else ans = -1;
break;
}
}
if(ans == 1) cout << ">" << endl;
else if(ans == -1) cout << "<" << endl;
}
return 0;
}
2.题解的思路:
只需要比较到 a.size() + b.size() - gcd(a.size(),b.size())即可,如果没出现不同,便是相同。
具体的证明没有提到,使用的是 the Periodicity Lemma
我个人理解的方法: 比较长度取2*max(a长度,b长度)。
无限长体现在字符串结束之后的又一个字符串连接。
这样,取较长字符串的2倍,我们可以看到两个字符串在无限时的连接部分。
由此可以判断相等。
J:给你一个定积分,求定积分的结果取模998244353
当初写题时发现过题量异常,所以去OEIS看了一下,得到结论。
现在滚回来求积分:
其次:分数p/q对mod取模,采用费马小定理取模。
即:p/q%mod = p*快速幂(q,mod-2)%mod。
注意:阶乘需要打表,不然超时
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2e6 + 500;
const int mod = 998244353;
int n;
long long jie[maxn];
long long quickPower(long long x, long long y)//快速幂加取模
{
long long result = 1; // 定义答案
while (y > 0) // 当指数大于 0 时进行幂运算
{
if (y & 1) // y 和 1 做与运算,相当于对 2 求模
{
result = (result * x) % mod;// 如果 y 为奇数,则结果只乘一个 x
}
x = x * x % mod; // x 乘二次方,下次使用
y = y >> 1; // y 右移一位,相当于除以 2
}
return result % mod; // 返回结果
}
void init()
{
jie[0] = 1;
jie[1] = 1;
for(int i = 2; i <= 2e6 + 50; i++)
{
jie[i] = jie[i-1] % mod * i % mod;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
while(cin >> n)
{
long long p = jie[n] * jie[n] % mod;
long long q = jie[2*n+1];
long long ans = p * quickPower(q,mod - 2) % mod;
cout << ans << endl;
}
return 0;
}
I:一般图匹配,带花树开花算法,学了就回来补上
监督自己补题:A H I