A - 你能数的清吗 51Nod - 1770(找规律)

演演是个厉害的数学家,他最近又迷上了数字谜。。。。

他很好奇 xxx...xxx(n个x)*y 的答案中 有多少个z,x,y,z均为位数只有一位的整数。

大概解释一下:

22222*3 = 66666,里面有5个6。

Input 多组测试数据。 第一行有一个整数T,表示测试数据的数目。(1≤T≤5000)

接下来有T行,每一行表示一组测试数据,有4个整数x,y,z,n。 (1≤x,y≤9,0≤z≤9,1≤n≤10^9) Output

对于每一组数据,输出一个整数占一行,表示答案。 Sample Input 2 2 3 6 5 3 3 0 10 Sample Output

5 0

思路

  1. [ ] 题意:这一题给我们一个长度为n各个位数上的数均是x,然后让这个数与y相乘,得到一个多位数,问在这个多位数的位置上数等 z 等数量有多少个
  2. [ ] 思路
    • 首先这一题的数据范围是 \(1 =< n<= 1e9\),所有所用的算法复杂度\(<=O(n)\)
    • 规律1:对于\(x*y<10\),这个多位数上的每一个数都相同,直接比较x*y 与 z 的值就行了
    • 规律2:(在考虑这个规律之前,我们把所乘得到的多位数 分 开始部分、中间部分、结尾部分 三个字段) 对于\(x*y >=10\) ,这个时候 我们就要考虑到 进位 的问题了,但是我们发现,虽然这个 有进位问题但是 其中在这个中间部分仍然可能(对于n比较的大的时候)有一个连续子段,在这子段上各个位数上的数字都相同,而对与这个多位数的 结尾部分一定只有一个数与中间部分的数不同 ,而在开始部分最多只包含3个数与中间连续部分呢的数一定不同,那么在这个规律的基础上解决 “进位” 所带来的麻烦情况,剩下的就是遍历去判断 z 是否与 “中间位置的那个相同的数”“开头最多超过三个数”“结尾的那个数”是否相同,因为中间部分的非常长的连续相同的字段,所以我们可以优化很多不必要的比较

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; inline void Read(int & x)
{
int ans = 0, f = 1;
char ch = getchar();
while(! isdigit(ch)) { if(ch == '-') f = -1; ch =getchar(); }
while(isdigit(ch)) { ans *= 10, ans += ch - '0'; ch = getchar(); }
x = ans * f;
}
inline int read()
{
char ch = getchar();
int x = 0, f = 1;
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
} int main()
{
/* freopen("A.txt","r",stdin); */
int x, y, z, n;
int t;
//scanf("%d", &t);
t = read();
while(t --)
{
//scanf("%d %d %d %d", &x, &y, &z, &n);
x = read(), y = read(), z = read(), n = read();
if(x * y < 10)
{
if(x*y == z)
printf("%d\n", n);
else
printf("0\n");
}
else
{
int jinzhi = x*y / 10;
int yushu = x*y % 10;
int a[10] = {0};
a[yushu] ++;
while(-- n)
{
yushu = (x*y + jinzhi) % 10;
jinzhi = (x*y + jinzhi) / 10;
if(a[yushu])
{
a[yushu] += n;
break;
}
else
{
a[yushu] ++;
}
}
a[jinzhi] ++;
printf("%d\n", a[z]);
}
} return 0;
}

最新文章

  1. Chrome
  2. C语言基础(4)-原码,反码,补码及sizeof关键字
  3. Redis 复制、Sentinel的搭建和原理说明
  4. 浅谈 原生javaScript&amp;&amp;react 实现全局触摸按钮(附带对addeventlistener的了解)
  5. 两个div叠加触发事件发生闪烁问题
  6. 定时自动关闭messagebox
  7. dos快速通道
  8. XAMPP for Linux
  9. 详解在Visual Studio中使用git版本系统
  10. Struts---- &lt;s:bean&gt;标签
  11. flume 自己定义 hbase sink 类
  12. ACM网络镜像赛
  13. JS事件监听器 addEventListener
  14. 【洛谷1640】[SCOI2010]连续攻击游戏
  15. 吴恩达《机器学习》课程笔记——第七章:Logistic回归
  16. [蓝桥杯]PREV-26.历届试题_最大子阵
  17. Golang GC原理
  18. tensorflow pip install 安装指定版本的包并指定安装源(速度会快很多)
  19. java的redis工具类
  20. 使用ALVideoPlayerSurface制作视频播放器

热门文章

  1. Python入门的三大问题和三大谎言
  2. vue 不用npm下载安装包 该如何引用js
  3. socket TCP 从0实现音频传输 ALSA 播放
  4. kafka实现无消息丢失与精确一次语义(exactly once)处理
  5. net core天马行空系列:移植Feign,结合Polly,实现回退,熔断,重试,超时,做最好用的声明式http服务调用端
  6. vue项目 github 上传项目并链接地址
  7. ECNU 计算机系统 (CSAPP) 教材习题作业答案集
  8. 读书笔记——莫提默&#183;J.艾德勒&amp;查尔斯&#183;范多伦(美)《如何阅读一本书》
  9. Jenkins+Ant+JMeter集成
  10. Andorid 添加MenuPopup