#6233. Hash killer V(高精)
思路:答案取所有模数的最小公倍数,然后转换为 进制这样 ,然后第一个串全部为 ,满足字典序最小,妙啊,注意求 的时候要先对 取模。
#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;
}