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;
}
posted @ 2022-08-23 11:44  高尔赛凡尔娟  阅读(22)  评论(0编辑  收藏  举报