HDU-1163Eddy's digital Roots,九余定理的另一种写法!
下午做了NYOJ-424Eddy's digital Roots后才正式接触了九余定理,不过这题可不是用的九余定理做的。网上的博客千篇一律,所以本篇就不发篇幅过多介绍九余定理了;
但还是要知道什么是九余定理:
九余数定理
一个数对九取余后的结果称为九余数。
一个数的各位数字之和相加后得到的<10的数字称为这个数的九余数(如果相加结果大于9,则继续各位相加)
简单的说就是:一个整数模9的结果与这个整数的各位数字之和模9的结果相同;
以前做题不知道有这个定理一般暴力就过了,求数位和也不复杂,只不过更省时间而已;
先来看看HDU-1163Eddy's digital Roots,博主是在NYOJ上做的这题时间限制是3s;
题意:求N^N的数位和(结果是个位数),开始打表找规律也没发现什么规律,于是想了另外一种方法:可以发现n的数位和的n次方再求数位和其实就等于n的n次方的数位和;比如:n=11,结果应该是5;11的数位和等于2,而2^11的数位和就等于5;进一步发现:
F(2^11)=F(8*8*8*4)=F(8*8)*F(8)*F(4)=F(64)*F(8)*F(4)=F(10)*F(8)*F(4)=F(80)*F(4)=F(8)*F(4)=F(32)=F(5)=5;
F(11^11)=F(11)*F(11)*...*F(11)=F(2)*F(2)*...*F(2)=F(2)^11=F(2^11);
所以此题就可以先求出N的数位和然后只需一层循环一直乘以N的数位和,注意当乘积大于10时需要再进行求数位和然后再重复操作;最后别忘了将循环里得到的值再求数位和;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
while(~scanf("%d",&n)&&n)
{
int sum=n;
while(sum>=10)//将n的数位和求出;
{
int x=0;
while(sum)
{
x+=sum%10;
sum/=10;
}
sum=x;
}
int d=sum;
for(i=2; i<=n; i++)
{
while(sum>=10)
{
int x=0;
while(sum)
{
x+=sum%10;
sum/=10;
}
sum=x;
}
sum*=d;
}
while(sum>=10)//最后得到的值再求数位和;
{
int x=0;
while(sum)
{
x+=sum%10;
sum/=10;
}
sum=x;
}
printf("%d\n",sum);
}
return 0;
}
上述代码在NYOJ上运行时间是1680ms,时限3s;而HDU运行时间0ms,时限1s,真是神奇呵!;
运用九余定理AC代码:确实很简洁方便!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,temp;
while(~scanf("%d",&n)&&n)
{
temp=n;
for(int i=2;i<=n;i++)
temp=(temp%9*n)%9;
if(temp==0)//此处需要注意;
printf("9\n");
else
printf("%d\n",temp%9);
}
return 0;
}
下面再来看NYOJ-485A*B Problem,此题题意很简单,就是求A*B的数位和;很明显方法很多,但是时限是1s,所以。。。所以这题只能用九余定理做吗?应该是的,我用九余定理运行时间986ms勉强过了,而用分治法超时了。。。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
long long n,m;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
if(m==0||n==0)//这里需注意一下特殊情况;
{
printf("0\n");
continue;
}
n%=9;
m%=9;
long long x=(n*m)%9;
if(x==0)
printf("9\n");
else
printf("%lld\n",x);
}
return 0;
}
HDU-1163Eddy's digital Roots,九余定理的另一种写法!的更多相关文章
- HDU——1163Eddy's digital Roots(九余数定理+同余定理)
Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 51nod 1433 0和5【数论/九余定理】
1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 小K手中有n张牌,每张牌上有一个一位数的数,这个 ...
- HDOJ 1163 Eddy's digital Roots 九余数定理+简单数论
我在网上看了一些大牛的题解,有些知识点不是太清楚, 因此再次整理了一下. 转载链接: http://blog.csdn.net/iamskying/article/details/4738838 ht ...
- FZU 1057 a^b 【数论/九余定理】
Accept: 1164 Submit: 3722Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 对于任 ...
- hdu 5585 Numbers【大数+同余定理】
Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Digital Roots:高精度
C - Digital Roots Description The digital root of a positive integer is found by summing the digits ...
- Eddy's digital Roots
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission ...
- 如何运用同余定理求余数【hdoj 1212 Big Number【大数求余数】】
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- J - Judge(快速幂)(同余定理)
J - Judge Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit S ...
随机推荐
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没 ...
- 扩展KMP的应用
扩展KMP的应用: 给出模板串S和串T,长度分别为Slen和Tlen,要求在线性时间内,对于每个S[i](0<=i<Slen),求出S[i..Slen-1]与T的 最长公共前缀长度,记为e ...
- 暴力/进制转换 Codeforces Round #308 (Div. 2) C. Vanya and Scales
题目传送门 /* 题意:问是否能用质量为w^0,w^1,...,w^100的砝码各1个称出重量m,砝码放左边或在右边 暴力/进制转换:假设可以称出,用w进制表示,每一位是0,1,w-1.w-1表示砝码 ...
- 配置Ubuntu16.04第03步:安装搜狗输入法
1.进入搜狗官网:https://pinyin.sogou.com/linux/ ,下载搜狗输入法安装包 2.使用dpkg命令安装Deb包: sudo dpkg -i sogoupinyin_2.0. ...
- javascript 笔记--变量
用了这么久的Javascript,该总结下了!温故而知新! var 声明变量: javascript 是弱类型语言,因此无需为声明对象明确类型声明. 如:var test="字符串" ...
- spring实现模板文件下载
前台 <form id="batchModel0" method="post" action="/common/download-file&qu ...
- Spring注解驱动开发之web
前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...
- kafaka
http://www.360doc.com/content/15/0429/12/9350055_466788393.shtml 一.Kafka中的核心概念 Producer: 特指消息的生产者 Co ...
- poj2886 Who Gets the Most Candies?
思路: 先打反素数表,即可确定因子最多的那个数.然后模拟踢人的过程确定对应的人名.模拟的过程使用线段树优化加速. 实现: #include <cstdio> #include <cs ...
- Android开发-下载网络图片并显示到本地
Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...