博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yet Another Multiple Problem 同余定理 bfs
阅读量:5066 次
发布时间:2019-06-12

本文共 1449 字,大约阅读时间需要 4 分钟。

  题意:

给出一个n和m个数

 

求一个最小的数 1 为n的倍数  2 没有这m个数字中的任意一个

 

123%n = ((((1%n)*10+2)%n)*10+3)%n

如果     a%n==b%n     

那么    (a+x)%n==(b+x)%n

 

这样就可以剪枝了   之前取模n出现过的后来再出现就可以不要了     

 

例如  

A%n==B%n 且 A<B 那么B就不用处理了

#include
#include
#include
#include
#include
#define LL __int64using namespace std; const int MAXN = 11111; struct Node{ vector
num; int c;} tmp; queue
q; int have[MAXN];int vis[11]; int n; void bfs(){ while(!q.empty()) q.pop(); memset(have,0,sizeof(have)); for(int i = 1;i < 10;i++) if(!vis[i]) { if(have[i%n]) continue; tmp.num.clear(); tmp.num.push_back(i); tmp.c = i%n; q.push(tmp); have[i%n] = 1; } while(!q.empty()) { Node cur = q.front(); if(cur.c == 0) break; q.pop(); for(int i = 0;i < 10;i++) { if(vis[i]) continue; int tt = (cur.c*10+i)%n; if(!have[tt]) { have[tt] = 1; tmp.num.clear(); for(int j = 0;j < cur.num.size();j++) tmp.num.push_back(cur.num[j]); tmp.num.push_back(i); tmp.c = tt; q.push(tmp); } } } if(!q.empty()) { for(int i = 0;i < q.front().num.size();i++) printf("%d",q.front().num[i]); puts(""); } else puts("-1");} int main(){ int m; int cas = 0; while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); for(int i = 0;i < m;i++) { int a; scanf("%d",&a); vis[a] = 1; } printf("Case %d: ",++cas); bfs(); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/bxd123/p/10994241.html

你可能感兴趣的文章
刚刚开始
查看>>
Optional 的基本用法
查看>>
洋葱第4场C和D题解……
查看>>
php实现隐藏字符串的功能
查看>>
设计模式08: Composite 组合模式(结构型模式)
查看>>
编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...
查看>>
公网IP和私有IP的区别和用途
查看>>
在一台win10上启动多个mysql
查看>>
TensorFlow 从零到helloWorld
查看>>
@class、#import
查看>>
iOS 正则表达式使用的三种方式&语法
查看>>
kafka的使用
查看>>
AT2672 Coins
查看>>
团队计划会议-01
查看>>
Linux0.11内核--加载可执行二进制文件之1.copy_strings
查看>>
编写Nginx启停服务脚本
查看>>
这些老外的开源技术养活了很多国产软件
查看>>
看图软件推荐
查看>>
【IdentityServer4文档】- 欢迎来到 IdentityServer4
查看>>
安全测试的一些漏洞和测试方法
查看>>