NOIP2016模拟-1014T2 Rabbit Number
来源:互联网 发布:淘宝纸箱机器 编辑:程序博客网 时间:2024/06/05 00:48
10.14模拟T2-Rabbit Number
题目大意
设S(N)为N各位数字之和,如S(484) = 4 + 8 + 4 = 16;定义Rabbit Number为满足S(x*x) = S(x)*S(x)的数,问在(L,R)区间中有多少个Rabbit Number;
解题思路
首先我们可以先暴力打一个表,然后不难发现每一个Rabbit Number的每一位都小于等于3,并且每个Rabbit Number去掉末尾一些数后依旧是一个Rabbit Number.根据这个规律,只需要从0开始搜索,往高位进行进位,可以很容易打出代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define LL long long using namespace std;int n,k,a,b;LL sum(LL x) { int ans = 0; while ( x != 0 ) ans += x % 10,x /= 10; return ans ;}int get(int s) { int ans = 0; for (int i=0;i<4;i++ ) { LL x = s*10 + i; if ( x == 0 || sum(x*x) != sum(x)*sum(x) ) continue;//如果当前数不为Rabbit数,则不需再进位搜索; if ( a <= x && x <= b ) ans ++; if ( x <= b / 10 ) ans += get(x);//可以进位(进位后不大于R)则进位搜索 } return ans ;}int main() { freopen("rabbit.in","r",stdin); freopen("rabbit.out","w",stdout); scanf( "%d%d", &a, &b ); cout << get(0) << endl; fclose (stdin); fclose (stdout); return 0 ;}
数学证明
假设数字x为 x1x2x3,那么 s(x)^2 = x1^2 + x2^2 + x3^2 + 2x1x2 + 2x1x3 + 2x2x3。 当 x3^2<10, 2x2x3<10, 2x1x3+x2^2<10, 2x1x2<10, x1^2<10时, s(x^2) = s(x)^2。 所以x满足s(x)^2 = s(x^2) 时,必然满足各个位置上的数字小于等于3。
2 1
- NOIP2016模拟-1014T2 Rabbit Number
- CCF-NOIP2016 PJ T2
- NOIP2016 day2 t2蚯蚓
- July 17th 模拟赛C T2 Number Solution
- NOIP2016 T2 天天爱跑步
- noip2016 Day2 T2:蚯蚓 (归并)
- [luogu-2877]noip2016-day2-T2 蚯蚓 题解
- UOJ264 NOIP2016 day2 T2 蚯蚓(队列)
- 蚯蚓 NOIP2016 提高组 Day2 T2
- 20160823模拟赛T2
- 20160907模拟赛T2
- 11.15日模拟 T2
- NOIP模拟10.5 T2
- snacks模拟赛t2
- 【NOIP2016模拟7.11】排序
- 【NOIP2016模拟7.12】游戏
- 树[NOIP2016模拟]
- 【NOIP2016模拟7.8】Stree
- 关于const的使用
- linux yum 命令
- Pioneer 3-AT 中文数据表
- win10优化
- Py第九问 python 变量命名规范
- NOIP2016模拟-1014T2 Rabbit Number
- 异常没有输出到日志
- ShaderLab基础(Queue标签)
- hanoi塔问题解析(一) c++实现
- NPM常用命令
- 动态JavaWeb项目连接Tomcat服务器的问题
- https是如何工作的?
- Python包管理工具pip安装
- 设计模式之Java自定义观察者模式