C. C. Blog

Security Research, Algorithm and Data Structure

51Nod 1435 位数阶乘

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#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;
}
  • 本文作者: CCWUCMCTS
  • 本文链接: https://ccwucmcts.github.io/posts/13832/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!