51Nod1435 位数阶乘

Problem

X是一个n位数的正整数 (𝑥=𝑎0𝑎1...𝑎𝑛−1)

现在定义 F(x)=∏𝑖=0𝑛−1(𝑎𝑖!) , 比如F(135)=1!3!5!=720.

我们给定一个n位数的整数X(至少有一位数大于1,X中可能有前导0),

然后我们去找一个正整数(s)符合以下条件:

1.这个数尽可能大,

2.这个数中不能含有数字0或1。

3.F(s)=F(x)

Solution

把2到9阶乘拆开,发现质因子7的时候必选7或8或9,但8和9能拆开,这样数位更多,更优,向下同理,因此拆成2,3,5,7组成的即可。

Code

#include<stdio.h>
#include<set>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<string.h>
#define mem(ss) memset(ss,0,sizeof(ss))
#define rep(d, s, t) for(int d=s;d<=t;d++)
#define rev(d, s, t) for(int d=s;d>=t;d--)
typedef long long ll;
typedef long double ld;
typedef double db;
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
ll tp,n;
int sum[7];
int num[7]={2,3,5,7};
int ans[7];
int main(){
    io_opt;
    cin>>tp>>n;
    while(n){
        int tmp=n%10;
        switch(tmp){
            case 2:sum[0]+=1;break;
            case 3:sum[0]+=1;sum[1]+=1;break;
            case 4:sum[0]+=3;sum[1]+=1;break;
            case 5:sum[0]+=3;sum[1]+=1;sum[2]+=1;break;
            case 6:sum[0]+=4;sum[1]+=2;sum[2]+=1;break;
            case 7:sum[0]+=4;sum[1]+=2;sum[2]+=1;sum[3]+=1;break;
            case 8:sum[0]+=7;sum[1]+=2;sum[2]+=1;sum[3]+=1;break;
            case 9:sum[0]+=7;sum[1]+=4;sum[2]+=1;sum[3]+=1;break;
            default:break;
        }
        n/=10;
    }
    ans[3]+=sum[3];
    sum[2]-=sum[3];
    sum[1]-=sum[3]*2;
    sum[0]-=sum[3]*4;
    ans[2]+=sum[2];
    sum[1]-=sum[2];
    sum[0]-=sum[2]*3;
    ans[1]+=sum[1];
    sum[0]-=sum[1];
    ans[0]+=sum[0];
    for(int i=3;i>=0;i--){
        for(int j=1;j<=ans[i];j++){
            cout<<num[i];
        }
    }
    return 0;
}
posted @ 2019-10-19 18:42  CCWUCMCTS  阅读(114)  评论(0编辑  收藏  举报