C. Drazil and Factorial1400 / 构造

Posted 幽殇默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Drazil and Factorial1400 / 构造相关的知识,希望对你有一定的参考价值。


https://codeforces.com/problemset/problem/515/C
题目给的意思就是不包含0,1 且 f(x)==f(a) 且x要尽量的大。
自己的垃圾模拟做法:

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
bool check(int x)
{
    for(int i=2;i<=x/i;i++) if(x%i==0) return true;
    return false;
}
void solve(LL x)
{
	int a[15]={0};//分解阶乘,统计所有的数字出现的个数
	while(x) 
	{
		int temp=x%10;
		for(int i=2;i<=temp;i++) a[i]++;
		x/=10;
	}
	int index=0;//找到最大的阶乘数字
	for(int i=9;i>=2;i--) if(a[i]) {index=i;break;}
	for(int i=index;i>=2;i--)
	{
		while(a[i]>a[i+1]&&check(i))//如果是合数
		//在满足上一个阶乘的条件下,将多余的尽可能的分解
		{
			int s=i;
			for(int j=2;j<=s/j;j++) while(s%j==0) a[j]++,s/=j;
			if(s!=1) a[s]++;
			a[i]--;
		}
	}
	int ans[300]={0};
	for(int i=0;i<a[2];i++) ans[i]=2;//初始最小的是2的阶乘
	for(int i=3;a[i];i++)
		for(int j=0;j<a[i];j++) ans[j]++;//慢慢的累加
	for(int i=0;i<a[2];i++) cout<<ans[i];//输出结果
}
int main(void)
{
	LL n,x; cin>>n>>x;
	solve(x);
	return 0;
}

其实你会发现可以直接替换

  • 2!=2!
  • 3!=3!
  • 4!=3!2!2!
  • 5!=5!
  • 6!=5!3!
  • 7!=7!
  • 8!=7!2!2!2!
  • 9!=7!3!3!2!

故代码如下:

#include<bits/stdc++.h>
using namespace std;
string s[15]={"","","2","3","322","5","53","7","7222","7332"};
int main(void)
{
    long long int n,x; cin>>n>>x;
    string ans;
    while(x) ans+=s[x%10],x/=10;
    sort(ans.begin(),ans.end());
    reverse(ans.begin(),ans.end());
    cout<<ans;
    return 0;
}

以上是关于C. Drazil and Factorial1400 / 构造的主要内容,如果未能解决你的问题,请参考以下文章

[codeforces 516]A. Drazil and Factorial

Codeforce 515A - Drazil and Date

A. Drazil and Date1000 / 思维

CF516D Drazil and Morning Exercise

Codeforces 516D Drazil and Morning Exercise (栈二分)

Codeforces Global Round 14, C. Phoenix and Towers