假的数论gcd,真的记忆化搜索(Codeforce 1070- A. Find a Number)
题目链接:
原题:http://codeforces.com/problemset/problem/1070/A
翻译过的训练题:https://vjudge.net/contest/361183#problem/A
题目大意:
给你两个正整数p和x,让你求出最小的正整数m,满足m被p整除且m的各数位之和为x。
Input
仅含两个整数p和x(1<=p<=500, 1<=x<=5000).
Output
输出最小的正整数m,若无解则输出-1.
Examples
13 50
699998
61 2
1000000000000000000000000000001
15 50
-1
思路:
这个题目,按位数求和,乍一眼看上去很容易想到HDU的这个题 http://acm.hdu.edu.cn/showproblem.php?pid=1554,一开始也以为诗歌数论题,
但是一看到output里面有一个位数超过unsigned long long 接受的范围,就知道这题不一样。他求出来的,解,一定是一组位数数组an,然后连续打印得到结果
那求解某数,满足位数和,整除数,除了用能够运算的数解方程,还能怎么样?——穷举,每一个位数,【0,9】都试一试,类似数位dp的办法,
那这题用什么方式穷举呢?这题对时间有要求,目标数位是未知的,层数不知道,也就是说不能多层循环,那就考虑搜索,保证效率,
最重要的是,他要最小的,那一定要按照”层优先“来遍历,因为位数决定大小,dfs可能会先搜到长度更大,数更大而满足条件的,因此用bfs
由于最后要把宽搜的所有路径记录下来,且得到的an如果满足恰好能被p整除,一定要每次位数都检查,由于一位一位来检查,需要把上一位得到的余数记住
- 即:now(mod)=(pre(mod)*10+an)% p,now(sum)=pre(sum)+ an
- 又:观察到输入值极限为,500,5000,即求和不超过5000,超过了还找不到目标的数,即,不存在,输出 -1
- 有可能an不一样,但是各位求和一样。又有可能求和满足,但是不能整除,此时必有余数,余数可能有相同的,但是求和不满足
- 但是余数相同,求和相同的一组结果不是唯一的,比如3的次方数,能被整除的要求恰好就是各个位数和也能被整除,因此找到雷同的,可以先排除
设 vis【mod】【b】,a表示余数,b表当前位数和,作为标记,最先找到满足解的,从a1开始试【1,9】,后面的试【0,9】,一定是最小的,
将走过的路径的数记下来,即,ai到ai+1,即各个位数记下,即可
所以需要的元素是:mod,sum,an和len(n的值,当前第几层),标记的,vis【mod】【b】
附上代码(含步骤解释):
#include<iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue> typedef long long ll;
using namespace std;
const int n=,m=;
int p,x;
bool vis[n][m];//记录是否走过, 走过成"1" struct node {//记录路径 int len;//当前第几数位
int sum;//当前数位和.
int mod;//当前余数和,要一个一个加进去, //上一个的值要被下一个利用才可以得到下一个的 node();
char ans[];//节省空间
} head,tail;//从头到尾部,表示前一位h->t
//也可以开一个p[a][]
node::node() {
len=-,sum=,mod=;
memset(ans,,sizeof(ans));//初始化 } void bfs() {
queue<node>q;//倒序输出,队列
q.push(head);//头部入列,
while(!q.empty()) {//列为空,且之前没有新的tail压入queue,
//遍历求和范围超过了x,宽搜层数达到了极限--无解
head=q.front();//路径头部更新, 回到上一层,某层ans=ix队首压入,然后讨论
q.pop(); //弹出这一层//也可以写在后面
if(head.mod==&&head.sum==x) {
cout<<head.ans<<endl;//有解
return;
}
for(int i=; i<=; i++) {//遍历这一层,宽度为位数0,9
tail=head;//路径尾部更新,回到上一层
tail.len++;//长度更新,深度更新,第几位数
tail.sum+=i;//和更新
tail.mod=(tail.mod*+i)%p;//余数更新
tail.ans[tail.len]=i+'';// 更新当前这一层/长度/位数的值--0,9都试一次,
if(tail.sum<=x&&vis[tail.mod][tail.sum]==) {
//如果遍历过就直接排除,不更新,
//如果sum超过了x直接跳过,不更新路径
//tail=head不会和之前有区别
vis[tail.mod][tail.sum]=;//标记表示遍历过了
q.push(tail);//更新路径队列,压入尾部,
//表示这个位数为"i"时可以继续往下讨论,
//用queue记住还有可能讨论的值 } }
}
cout<<-<<endl;//如果队列最终为空,必为无解
} int main() {
while(cin>>p>>x) {
memset(vis,,sizeof(vis));
bfs();
}
return ;
}
虽然AC,但是又产生一个疑问:字符数组的长度是否有范围,显然如果输入x=5000,有5000位数都是1,就可以达到,剩下的全为0即可,那不是位数无穷了吗?
现在是运气好,所以这里字符串是有re危险的,其实最好设成vector,至于会不会超过vector,emmm毕竟能做出来,应该有一个位数极限,可以试出来
(待续)
假的数论gcd,真的记忆化搜索(Codeforce 1070- A. Find a Number)的更多相关文章
- LOJ2803 CCC2018 平衡树 数论分块、记忆化搜索
传送门 题意差评,其实就是一个递推式:\(f_1 = 1 , f_i = \sum\limits_{j=2}^i f_{\lfloor \frac{i}{j} \rfloor}\),然后求\(f_N\ ...
- 【bzoj4428】[Nwerc2015]Debugging调试 数论+记忆化搜索
题目描述 一个 $n$ 行的代码出了bug,每行都可能会产生这个bug.你要通过输出调试,在其中加入printf来判断bug出现的位置.运行一次程序的时间为 $r$ ,加入一条printf的时间为 $ ...
- uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)
题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后依照每份的个数排定字典序,而且划分时要求ai−1≤ai, ...
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- 逛公园 [NOIP2017 D1T3] [记忆化搜索]
Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...
- UVa 11762 Race to 1 (数学期望 + 记忆化搜索)
题意:给定一个整数 n ,然后你要把它变成 1,变换操作就是随机从小于等于 n 的素数中选一个p,如果这个数是 n 的约数,那么就可以变成 n/p,否则还是本身,问你把它变成 1 的数学期望是多少. ...
- zoj 3644 记忆化搜索
题目:给出一个有向图,从1到n,每个结点有个权值,每走一步,分值为结点权值的LCM,而且每一步的LCM都要有变化,问到达N的时候分值恰好为K的路径有多少条 记忆化搜索,虽然做过很多了,但是一直比较慢, ...
随机推荐
- C++中 string 中的方法的使用详解
string 字符串在所有的语言中都非常重要,c++也不例外,接下来我们将介绍string中的常用方法 1. size() 和 length() 函数 : 他们返回字符串的真实长度,且不会因为空格而截 ...
- 小米官网轮播图js+css3+html实现
官网轮播: 我的轮播: 重难点: 1.布局 2.图片和右下角小圆点的同步问题 3.setInterval定时器的使用 4.淡入淡出动画效果 5.左右箭头点击时,图片和小圆点的效果同步 6.另一种轮播思 ...
- rest_framework序列化,反序列化
序列化组件 from rest_framework.response import Response1.Response本质也是继承了httpresponse,比httpResponse还强大,传入一 ...
- 为arm-unknown-linux-gnueabi-gcc工具链添加常用库(zlib、libpng、libjpeg、libtiff、libtool)(转载)
主机环境: RHEL6.0 kernel 2.6.32-220.2.1.el6.i686 gcc-4.4.6 1.zlib http://sourceforge.net/projects/libp ...
- Contest 141
2019-06-16 14:35:52 1089. Duplicate Zeros - Easy 问题描述: 问题求解: 很显然的可以使用O(n), O(n)的解法.主要问题在于如何在O(1)空间复杂 ...
- 网维大师无盘刷新B盘方法
- Worktile正式入驻飞书,助力企业轻松实现敏捷开发与协作
企业在敏捷研发中时常面临着交付延期.需求不匹配等问题,如何更高效地完成敏捷研发? Worktile携手飞书,为企业用户提供敏捷开发服务,帮助企业实现软件项目的需求管理.缺陷追踪.迭代规划与推进以及效能 ...
- STM32CubeMx——串口使用DMA收发
用到的是DMA发送数据,接收还是普通的串口接收. 一.代码生成 1.按以前的方法设置好时钟和调试方式,这里就不多说了. 2.设置串口1. 3.在DMA Setting里点击Add添加USART1_TX ...
- 在C 中加载TorchScript模型
本教程已更新为可与PyTorch 1.2一起使用 顾名思义,PyTorch的主要接口是Python编程语言.尽管Python是合适于许多需要动态性和易于迭代的场景,并且是首选的语言,但同样的,在 许多 ...
- Attention-based Extraction of Structured Information from Street View Imagery:基于注意力的街景图像提取结构化信息
基于注意力的街景图像提取结构化信息 一种用于真实图像文本提取问题的TensorFlow模型. 该文件夹包含在FSNS数据集数据集上训练新的注意OCR模型所需的代码,以在法国转录街道名称. 您还可以使用 ...