2020牛客暑期多校训练营(第一场) FJ补题报告

F:给出两个字符串a,b。定义x ∞=xxx…,问: a ∞和b ∞按字典序比较的结果

1.我自己当时的思路

如果两个字符串的无限延伸相同,那么,这两个字符串一定有相同的循环节。(直觉)
所以,我取ab两字符串长度的gcd作为循环节长度,(如果存在循环节,那么gcd也一定是一个循环节)
特判完相等之后,o(n)比较不同就可以了。

#include 
#include 
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看了一下,得到结论。
现在滚回来求积分:
2020牛客暑期多校训练营(第一场) FJ补题报告_第1张图片
其次:分数p/q对mod取模,采用费马小定理取模。
即:p/q%mod = p*快速幂(q,mod-2)%mod。
注意:阶乘需要打表,不然超时

#include 
#include 
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

你可能感兴趣的:(2020牛客暑期多校训练营(第一场) FJ补题报告)