jzoj3058 火炬手

本文介绍了如何通过暴力搜索和优化策略解决一个数论问题,即给定一个整数 n,找到最小的 m 使得 n*m 的十进制表示仅包含0和1。关键在于理解数据范围和利用搜索技巧,通过递归实现的 dfs 函数有效地找到符合条件的最小乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

链接
给出一个 n n n,求一个最小的 m m m使 n ∗ m n*m nm的十进制只由0和1构成。

解题思路

考场上以为是数论推了半天最后交了暴力,赛后发现因为n比较小导致除了极限数据以外 n ∗ m n*m nm的结果都不会超过20位,搜索就能过。开long long 枚举n*m当前的第 i i i位是0还是1,搜到能整除n的就返回。
如果怕第一次搜到的不是最小的结果可以把搜到的所有答案存到数组里最后再排序。
本来99后面多加几个9都会爆但是数据太弱被水过去了

代码

#include<bits/stdc++.h>
using namespace std;
int n,tot;
unsigned long long minn=0;
void dfs(unsigned long long x,int dep)
{
	if(dep>19) return;
	if(x%n==0&&(minn==0||x<minn)) minn=x;
	dfs(x*10,dep+1);
	dfs(x*10+1,dep+1);
}
int main()
{
	cin>>n;
	dfs(1,1);
	cout<<minn/n;	
	return 0;
}

心疼隔壁打高精度结果没有极限数据的fjy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值