【20180807模拟测试】t1 function

low逼的我也只能写这样的水题。。。

题面

对于一个整数,定义 f(x)为他的每个数位的阶乘的乘积。例如 f(135)=1! * 3! * 5! =720。给出一个数 a(可以包含前缀零),a 满足他的至少一个数位大于 1。我们要求出最大 的整数 x,其中 x 不含 0 或 1,并且满足 f(a) = f(x)。
【输入】
第一行一个整数 n,表示 a 的长度。 接下来一个整数 a。
【输出】
一行一个整数 x 表示答案。
【输入样例 1】
4
1234
【输出样例 1】
33222
【样例 1 说明】
1! * 2! * 3! * 4! = 3! * 3! * 2! * 2! * 2!

分析

算了吧,你看着我无比整齐的代码会明白的
emm,以下官方正解

统计出质数 2、3、5、7 作为因子出现了多少次。
我们 claim 最后的答案一定由这四个数字构成。(比如考虑 8,还不如 7222)。
我们看看可以放几个 7,能放几个放几个,然后我们就没有 7 了。
我们看看可以放几个 5,能放几个放几个,然后我们就没有 5 了。
我们看看可以放几个 3,能放几个放几个,然后我们就没有 3 了。
最后再把剩下的 2 全放上去。

关于考试时的思路

亲测9!=7!*3!*3!*2!
8!=7!*2!*2!*2!
。。。
以此类推9个数而已3分钟就推完了
反正宁愿要多位数不要大的个位数
哪那么多废话
拆了
然后就只剩2,3,5,7开始拼凑(这和你拆的时候是个反向过程)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10010],b[1001],n,c[100100],cnt=0;
int main(){

    scanf("%d",&n);
    for(int i=1;i<=n;i++){
       char x;
       cin>>x;
       a[i]=x-'0';
       if(a[i]==2){b[2]++;}
       if(a[i]==3){b[2]++;b[3]++;}
       if(a[i]==4){b[2]+=3;b[3]++;}
       if(a[i]==5){b[2]+=3;b[3]++;b[5]++;}
       if(a[i]==6){b[2]+=4;b[3]+=2;b[5]++;}
       if(a[i]==7){b[2]+=4;b[3]+=2;b[5]++;b[7]++;}
       if(a[i]==8){b[2]+=7;b[3]+=2;b[5]++;b[7]++;}
       if(a[i]==9){b[2]+=7;b[3]+=4;b[5]++;b[7]++;}
    }
    for(int i=7;i>=2;i--){
       while(b[i]>0){
        c[++cnt]=i;
        if(i==2){b[2]--;}
        if(i==3){b[2]--;b[3]--;}
        if(i==4){b[2]-=3;b[3]--;}
        if(i==5){b[2]-=3;b[3]--;b[5]--;}
        if(i==6){b[2]-=4;b[3]-=2;b[5]--;}
        if(i==7){b[2]-=4;b[3]-=2;b[5]--;b[7]--;}
       }
    }
    for(int i=1;i<=cnt;i++)
    printf("%d",c[i]);
    return 0;
}
posted @ 2018-08-07 22:57  lisuier  阅读(139)  评论(0编辑  收藏  举报