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;
}

原文地址:https://www.cnblogs.com/sz-wcc/p/11704770.html

时间: 2024-10-09 05:00:29

51Nod1435 位数阶乘的相关文章

51nod 1435 位数阶乘

1435 位数阶乘 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 X是一个n位数的正整数 (x=a0a1...an−1) 现在定义 F(x)=∏i=0n−1(ai!)  , 比如F(135)=1!*3!*5!=720. 我们给定一个n位数的整数X(至少有一位数大于1,X中可能有前导0), 然后我们去找一个正整数(s)符合以下条件: 1.这个数尽可能大, 2.这个数中不能含有数字0或1. 3.F(s)=F(x)

1435 位数阶乘

1435 位数阶乘 基准时间限制:1 秒 空间限制:131072 KB X是一个n位数的正整数 (x=a0a1...an−1) 现在定义 F(x)=∏i=0n−1(ai!)  , 比如F(135)=1!*3!*5!=720. 我们给定一个n位数的整数X(至少有一位数大于1,X中可能有前导0), 然后我们去找一个正整数(s)符合以下条件: 1.这个数尽可能大, 2.这个数中不能含有数字0或1. 3.F(s)=F(x) Input 每个测试数据输入共2行. 第一行给出一个n,表示x为中数字的个数.(

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

乘法与位数

题目意思: 给你一个数,然后转化成相应进制的数,算出阶乘以后,求阶乘的位数 阶乘的位数我们这么来算: 例如1000的阶乘log10(1) + log10(2) + ...+log10(1000) 取整后加1 然后转化成进制的话就是: 除以log10(base) 后加1 题目: Description Factorial of an integer is defined by the following function f(0) = 1 f(n) = f(n - 1) * n, if(n > 0

算法笔记_211:第七届蓝桥杯软件类决赛部分真题(Java语言A组)

目录 1 阶乘位数 2 凑平方数 3 棋子换位 4 机器人塔 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 阶乘位数 阶乘位数 9的阶乘等于:362880 它的二进制表示为:1011000100110000000 这个数字共有19位. 请你计算,9999 的阶乘的二进制表示一共有多少位? 注意:需要提交的是一个整数,不要填写任何无关内容(比如说明解释等) 答案:118445 1 import java.math.BigInteger; 2 3 public class Main { 4 5

ACM新生国庆训练专场

题目B:DFS Problem Description 一个DFS(digital factorial sum)数是指各个位数的阶乘的和等于他本身的数.比如说145=1!+4!+5!,所以145是一个DFS数.现在请你找出 [1, 2147483647]范围内的所有DFS数. Input 没有输入 Output 一递增的顺序输出所有的DFS数,每个数一行. SampleInput 没有输入 SampleOutput 1 2 .... 1 #include <stdio.h> 2 int jc(

Codeforces Round #292 (Div. 2) C. Drazil and Factorial 515C

C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Drazil is playing a math game with Varda. Let's define  for positive integer x as a product of factorials of its dig

Problem 34

Problem 34 https://projecteuler.net/problem=34 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. 145是一个神奇的数字,1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all numbers which are equal to the sum of the factorial of their digits. 找到所有

UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)

题意:给出两个数字a和b,求a的阶乘转换成b进制后,输出(1)后缀中有多少个连续的0? (2)有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1)阶乘后缀0问题.先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html 解法差不多,稍变化. 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10