#6233. Hash killer V(高精)

#6233. Hash killer V(高精)

思路:答案取所有模数的最小公倍数,然后转换为 26 26 进制这样 h a s h = 0 hash=0 ,然后第一个串全部为 a a ,满足字典序最小,妙啊,注意求 g c d gcd 的时候要先对 B i g n u m Bignum 取模。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define ull unsigned long long
template<class T>
inline void read(T &x){ 
	x=0;int w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	for(;ch>='0'&&ch<='9';ch=getchar())
		x=(x<<3)+(x<<1)+(ch&15);
	x*=w; 
}
struct Bignum{
	int num[N*20];
	int len;
	void mul(ull x){	//高精乘低精. 
		ull s=0;
		for(int i=0;i<len;i++){
			s=s+num[i]*x;
			num[i]=s%26,s/=26;
		}
		while(s) num[len++]=s%26,s/=26;
	}
	ull mod(ull x){	//取模. 
		ull s=0;
		for(int i=len-1;~i;i--) s=(s*26+num[i])%x;
		return s;
	}
}ans; 
template<class T>
T gcd(T a,T b){
	return b==0?a:gcd(b,a%b);
}
int n;
ull a[N];
int main(){
	read(n);
	for(reg int i=1;i<=n;i++) read(a[i]);
	ans.len=ans.num[0]=1;
	for(reg int i=1;i<=n;i++) ans.mul(a[i]/gcd(a[i],ans.mod(a[i])));
	for(reg int i=0;i<ans.len;i++) putchar('a');
	putchar('\n');
	for(reg int i=ans.len-1;~i;i--) putchar('a'+ans.num[i]);
	putchar('\n');
  	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107479683