【20180807模拟测试】t1 function

本文介绍了一种算法,该算法通过分析整数中各数位阶乘因子的组合来寻找最大整数x,使得x不含0或1且其各数位阶乘的乘积等于给定整数a的相应乘积。通过统计质数2、3、5、7的出现次数,采用特定策略构造答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值