uva10825 (暴力)
2016-03-17 19:21
471 查看
题目大意:
给出m位n进制的数,要求它乘以2~m,求是否存在这样的数,乘以2~m之后得到的数是原来的数组成的数字。
思路:
搞了快一小时。。唉。
首先,由于是乘以2~m后都要是原来的数字所组成的,所以假如最后一位是a,那么里面必定存在一位是(2*a)%n 也必定存在一个数属于2~m 乘以a对n求余存在于这m位数当中。
枚举最后一位数,最后一位数肯定位于1~n-1 因为肯定不能超过进制数,也不可能是0 如果是0的话 那么肯定不可能存在这么一串数字。
代码:
给出m位n进制的数,要求它乘以2~m,求是否存在这样的数,乘以2~m之后得到的数是原来的数组成的数字。
思路:
搞了快一小时。。唉。
首先,由于是乘以2~m后都要是原来的数字所组成的,所以假如最后一位是a,那么里面必定存在一位是(2*a)%n 也必定存在一个数属于2~m 乘以a对n求余存在于这m位数当中。
枚举最后一位数,最后一位数肯定位于1~n-1 因为肯定不能超过进制数,也不可能是0 如果是0的话 那么肯定不可能存在这么一串数字。
代码:
#include <iostream> using namespace std; #include <cstring> #include <stdio.h> #include <algorithm> int num[7]; int vis[7]; int order[7]; int n,m; bool solve(int x) { for(int i = 2; i <= m; i++) order[i] = i; do { bool flag2 = true; for(int i = 2; i <= m; i++) { memset(vis,0,sizeof(vis)); vis[i] = 1; int c = x * i / n; for(int j = 2; j <= m; j++) { int temp = (num[order[j]] * i + c) % n; c = (num[order[j]] * i + c) /n; bool flag = false; for(int k = 1; k <= m; k++) { if(temp == num[k] && !vis[k]) { vis[k] = 1; flag = true; break; } } if(!flag) { flag2 = false; break; } } if(!flag2) break; } if(flag2) return true; }while(next_permutation(order + 2, order + m + 1)); return false; } int main() { while(scanf("%d %d",&m,&n) && m) { bool flag = false; for(int i = 1;i < n; i++) { for(int j = 1; j <= m; j++) { num[j] = (i * j) % n;//i是枚举的最后一位 num记录的是数字中的每一位 } if(solve(i)) { flag = true; for(int j = m; j >= 2; j--) printf("%d ",num[order[j]]); printf("%d\n",i); break; } } if(!flag) printf("Not found.\n"); } }
相关文章推荐
- LeetCode minDepth of 2 bin tree
- 第二周问题汇总
- mengento 数据库模型
- 404、500、502等HTTP状态码介绍
- android 内存处理工具
- C++ STL stack/queue
- java当中this应该怎么理解?
- 好文记载
- 消息系统Kafka介绍
- 100万并发连接服务器笔记之Erlang完成1M并发连接目标
- 微信用户昵称乱码解决
- 批量启动\停止ORACLE服务
- 100万并发连接服务器笔记之1M并发连接目标达成
- 堆的应用:解决海量数据,从复杂度优化
- 方法与数组
- 什么是备份策略?
- maven project
- Java中,jsp文件编译之后部署显示中文乱码
- 100万并发连接服务器笔记之测试端就绪
- 第3周项目4(3)年龄几何