每个称号由一个形容词和一个名词组成。 我们认为一个称号是有祝福之力的,当且仅当称号中形容词和名次的长度都是祝福值。 在cc王国中,祝福值由以下公式定义: 如果一个数x满足: 如果存在一个 i 属于[0, 114514) 使得x == homoit(i),则称x是祝福值。 homoit(x) = pow(x, x+pow(x, x+114514)%114514)%114514 (pow(x,y)表示x的y次方,注意0的0次方应该为1) 同时,黄瑞士还希望他的称号足够拉风,当俩个单词的相加长度大于k时则认为这个称号是拉风的。 现在温锦鹏将给你一本精灵字典,请你帮助黄瑞士找到字典序最小的称号。 输入 输入第一行给出三个整数n,m,k,分别表示形容词的个数,名次的个数和k(1<=n,m<=3000,1<=k<114514) 接下来两行分别给出形容词表和名次表(所有单词总长度小于114514,同一行的单词不会有重复) 输出 输出符合条件的字典序最小的称号,没有则输出None

#include <iostream>
using namespace std;
#define ll long long
const int mod=114514;
int a[mod];
int pow(int x,int y)
{
	if(y==0) return 1;
    int tmp=pow(x,y/2);
    if(y%2==1)
     return (ll)tmp*tmp%mod*x%mod;// 注意这里要加上long long类型,不然会爆掉,题目包含的坑。
    return (ll)tmp*tmp%mod;
}
int homoit(int x)
{
	return pow(x,x+pow(x,x+114514)%114514)%114514;
}
void zhufu()
{
	for(int i=0;i<114514;i++)
    {
    	a[homoit(i)]=1;
    }
}
int main ()
{
	zhufu();
	int n,m,k;
    cin>>n>>m>>k;
    string s;
    vector<string> v1,v2;
    for(int i=0;i<n;i++) 
    {
    	cin>>s;
        if(a[s.size()]) v1.push_back(s);
    }
    for(int i=0;i<m;i++)
    {
    	cin>>s;
        if(a[s.size()] v2.push_back(s);
    }
    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    for(string s1:v1)
    for(string s2:v2)
    {
    	if(s1.size()+s2.size()>k)
        {
        	cout<<s1<<" "<<s2<<endl;
            return 0;
        }
    }
    cout<<"None"<<endl;
}