poj 1426 Find The Multiple
2015-08-11 10:41
316 查看
题意:
给出一个数n(n>0&&n<=200),有一个m(m>0),n*m组成的数是由0和1组成的十进制数,输出这个数n*m
分析:ans[i]表示i对应的答案,如果i是偶数,则i可以表示为2*k(k=i>>1),ans[i]=ans[k]*10,肯定符合题意(10/2=5)
如下:
if(i是奇数)
搜索答案;
if(i是偶数)
ans[i]=ans[i>>1]*10;
这样就可以把偶数的搜索减去了
搜索的方法就是遍历,每次把上一次的数分别*10 和*10+1检测是否符合题意(暴力)
代码:
给出一个数n(n>0&&n<=200),有一个m(m>0),n*m组成的数是由0和1组成的十进制数,输出这个数n*m
分析:ans[i]表示i对应的答案,如果i是偶数,则i可以表示为2*k(k=i>>1),ans[i]=ans[k]*10,肯定符合题意(10/2=5)
如下:
if(i是奇数)
搜索答案;
if(i是偶数)
ans[i]=ans[i>>1]*10;
这样就可以把偶数的搜索减去了
搜索的方法就是遍历,每次把上一次的数分别*10 和*10+1检测是否符合题意(暴力)
代码:
#include<iostream> using namespace std; long long ans[205]; long long q[100000000]; long long dfs(int n) { int l,r; l=r=0; q[r++]=1; while(1) { long long num=q[l++]; if((num*10)%n==0) return num*10; if((num*10+1)%n==0) return num*10+1; q[r++]=num*10; q[r++]=num*10+1; } return -1; } int main() { ans[1]=1; for(int i=2;i<=200;i++) { if(i&1) ans[i]=dfs(i); else ans[i]=ans[i>>1]*10; } int n; while(~scanf("%d",&n)&&n) { printf("%lld\n",ans[n]); } return 0; }
相关文章推荐
- Java 多并发之原子访问(Atomic Access)
- maven-surefire-plugin总结
- lamp(四)mysql操作
- 实战iOS 9:开发者必须掌握的三种搜索API
- iptables工具
- ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57
- sqlite3 — 轻量级嵌入式平台数据库开源软件
- pat 水 1005. 继续(3n+1)猜想 (25)
- 20-IO流-03-IO流(字符流-FileWriter)
- HDU 5338 ZZX and Permutations
- 本地使用SharedPreference记录状态
- jQuery 鼠标拖拽排序
- 获得IP地址中文
- 类模板
- Java中Object转化为int类型
- 寻找技术编辑大牛
- SQLite3的操作命令
- vsftp配置勘误
- APIController原型
- find记录