洛谷:P1988 火炬

文章讲述了如何解决一个难题,即在给定一个正整数N的情况下,找到一个最小的正整数M,使得N×M的十进制表示中只包含数字1和0。通过深度优先搜索(DFS)算法实现,但强调了代码常常因时间复杂度过高(TLE)而需要优化。
摘要由CSDN通过智能技术生成

时间限制1.00s         内存限制125.00MB         难易度:普及/提高−

【题目描述】

2008 北京奥运会,你想成为四川汶川的一名火炬手,经过层层选拔,终于到了最后一关。

这一关是一道很难的题:任意给定一个正整数 N,求一个最小的正整数 M,使得 N×M 的十进制表示形式里只含有 1 和 0

【输入格式】

一行一个正整数 N。

【输出格式】

输出一行,如果有解,输出一个整数,表示最小的 M,否则输出 No Solution

【输入输出样例】

输入 #1

12

输出 #1

925

【说明/提示】

1≤N≤10^5

【算法分析】

这道题挺难的,总是TLE,下面是深搜代码,先求n和m的积,m=nm/n

【参考代码】

#include<bits/stdc++.h>
using namespace std;
long long n,nm,m;
void dfs(long long num,int step)
{
	if(step==20) return; //边界。
	if(num%n==0&&(num<nm||nm==0)) nm=num; //求n和m的乘积。
	dfs(num*10,step+1); //下一位是0。
	dfs(num*10+1,step+1); //下一位是1。 
}
int main()
{
	cin>>n;
	dfs(1,1);
	if(nm!=0) //如果n和m的乘积不是初始值了。
    {
        m=nm/n;
        cout<<m;
    }
	else cout<<"No Solution"; //如果仍是初始值即没有符合条件的m。
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值