Codeforces Round #292 (Div. 2) C. Drazil and Factorial(数学)
https://codeforces.com/contest/515
题目大意:
给我们一个长度为n的数字a
定义F(a)=a里面每一位数的阶层总乘积
让我们求最大的x,需要满足F(x)=f(a)并且x中没有0和1
input
4
1234
output
33222
input
3
555
output
555
这个题目挺有意思的,虽然vp的时候写出来了,但是还是很想记录一下
-
关于阶层互换,我们可以看到,纯素数时只能由它自己替换他自己,但是比素数大的其他部分就可以用非素数进行替代
-
进行拆解的时候需要注意,拆解的较大的数字时,比如3,其实它内部还包含了一个2,所以前面必须同时划掉一个2
-
再看一个例子,当要拆解9的时候,前面最挨近它的素数就是7,所以前面的7!就用这个7来替代,面对8 * 9时,8可以分成2!* 2!* 2!,但是9=3 * 3,总和8和9就是2!* 3!* 3!
详情可以根据上图和代码模拟
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
//cin>>T;
while(T--)
{
int n;
cin>>n;
string s;
cin>>s;
map<int,int> mp;
for(int i=0;i<n;i++)
{
if(s[i]=='0'||s[i]=='1') ;
else if(s[i]=='2') mp[2]++;
else if(s[i]=='3') mp[3]++;
else if(s[i]=='4')
{
mp[2]+=2;
mp[3]++;
}
else if(s[i]=='5') mp[5]++;
else if(s[i]=='6')
{
mp[5]++;
mp[3]++;
}
else if(s[i]=='7') mp[7]++;
else if(s[i]=='8')
{
mp[2]+=3;
mp[7]++;
}
else if(s[i]=='9')
{
mp[2]++;
mp[3]+=2;
mp[7]++;
}
}
for(int i=9;i>=2;i--)
{
while(mp[i]>0)
{
cout<<i;
mp[i]--;
}
}
cout<<endl;
}
return 0;
}