2005循环

题目描述 Description

乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。

众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:

循环
循环长度

2
2、4、8、6
4

3
3、9、7、1
4

4
4、6
2

5
5
1

6
6
1

7
7、9、3、1
4

8
8、4、2、6
4

9
9、1
2

这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?

注意:

1.如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。

2.如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a+L次幂的最后k位都相同。

输入描述 Input Description

输入只有一行,包含两个整数n(1<=n<10100)和k(1<=k<=100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。

输出描述 Output Description

输出包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。

样例输入 Sample Input

32 2

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

【数据规模】

对于30%的数据,k<=4;

对于全部的数据,k<=100。

题解:

数论+高精度。

我们只需要计算后k位,而且我们可以从1位1位分析下去。我们就当样例来算一下:先求出最后一位2需要几次才能循环,求出答案4;在求32,后面的位数都相同,至少要32(4)的两位,得76(这一点我们可以在a数组上乘,会方便很多)。我们再让32每次*76,求出1。最后用4*1求得答案=4。

type ar=array[0..1001]of longint;

var i,j,s,k:longint;

n:ansistring;

a,b,ans:ar;

procedure cheng1(var a:ar;b:ar);

var i,j:longint;

c:ar;

begin

fillchar(c,sizeof(c),0);

for i:=1 to a[0] do

for j:=1 to a[0]-i+1 do

begin

c[i+j-1]:=c[i+j-1]+a[i]*b[j];

c[i+j]:=c[i+j]+c[i+j-1]div 10;

c[i+j-1]:=c[i+j-1]mod 10;

end;

c[0]:=b[0];

a:=c;

end;

procedure cheng2(var a:ar;b:longint);

var i:longint;

c:ar;

begin

fillchar(c,sizeof(c),0);

for i:=1 to a[0] do

begin

c[i]:=a[i]*b+c[i];

c[i+1]:=c[i] div 10;

c[i]:=c[i] mod 10;

end;

c[0]:=a[0];

while c[c[0]+1]>0 do

begin

inc(c[0]);

c[c[0]+1]:=c[c[0]] div 10;

c[c[0]]:=c[c[0]]mod 10;

end;

a:=c;

end;

begin

readln(n);

val(copy(n,pos(‘ ‘,n)+1,length(n)),k);

delete(n,pos(‘ ‘,n),length(n));

inc(ans[0]);

inc(ans[1]);

a[0]:=length(n);

for i:=1 to a[0] do a[a[0]-i+1]:=ord(n[i])-48;

for i:=1 to k do

begin

for j:=1 to i do b[j]:=a[j];

b[0]:=i;

s:=1;

cheng1(b,a);

while (s<=10)and(b[i]<>a[i]) do

begin

cheng1(b,a);

inc(s);

end;

if b[i]<>a[i] then

begin

write(‘-1‘);

exit;

end;

b:=a;

for j:=1 to s-1 do cheng1(a,b);

cheng2(ans,s);

end;

for i:=ans[0] downto 1 do write(ans[i]);

end.

时间: 2024-10-10 09:40:09

2005循环的相关文章

简单for循环

1问题:如何定义N年年份 2答: 定义每个变脸=量 3问题:N年年份如何进行判断瑞年或平年 4答:循环判断 解: 引入产生N年年份:range(star,stop,step) 程序: for year in range(1990,2005) if: ( i %400 ==0)or (year%4 ==0 and year%100!=0) print("leapyear: %d"  %year) else: print("pingnian:%d" %year)

1、C#基础:变量、运算符、分支、循环、枚举、数组、方法

C#..Net以及IDE简介 一.什么是.Net? .Net指 .Net Framework框架,一种平台,一种技术. .Net Framework框架是.Net平台不可缺少的一部分,它提供了一个稳定的运行环境来保证我们基于.Net平台开发的各种应用能够正常运转. .Net Framework 各版本区别 2002年 1.0------vs2002 统一类型系统,基础类库,垃圾回收,多语言支持.ado.net 1.0.asp.net 1.0.winform 1.0. 2003年 1.1-----

Visual Studio 2005 自带单元测试

一 单元测试简介 单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节.也是唯一需要编写代码才能进行测试的一种测试方法.在标准的开发过程中,单元测试的代码与实际程序的代码具有同等的重要性.每一个单元测试,都是用来定向测试其所对应的一个单元的数据是否正确. 单元测试是由程序员自己来完成,最终受益的也是程序员自己.可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试.执行单元测试,就是为了证明这段代码的行为和我们期望的一致. 单元测试还具有一下几个好处:  能

SQL SERVER 2005快捷键+visual studio 2008 快捷键

一.SQL SERVER 2005快捷键  快捷键                                       功能           CTRL       +       SHIFT       +       B生成解决方案           CTRL       +       F7           生成编译           CTRL       +       O                                   打开文件          

在 Oracle 数据库上使用 Visual Studio 2005 或 2008 构建 .NET 应用程序 了解构建使用 Oracle 数据库的 .NET 应用程序所涉及到的基本但不可或缺的过程。

随着 Microsoft 的 .NET Framework 的日益流行,许多开发人员迫切想了解关于将 .NET 应用程序与 Oracle 集成的最佳方法的信息 - 不仅在基本连通性方面,还包括与使用 Visual Studio 2005 或 2008 进行有效应用程序开发的关系. 在本文中,我将说明构建使用 Oracle 数据库的 .NET 应用程序所涉及到的基本但不可或缺的过程,包括: 如何添加工程引用,以在您的 .NET 工程中支持 Oracle 类 如何创建 Oracle 数据库连接字符串

Sicily 2005.Lovely Number

题目地址:2005.Lovely Number 思路: 若测试数据出现的次数为奇数,则输出它. 所以,可以先排序,若前后相等,前后都设为0,最后不为0的则可以输出. 具体代码如下: 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int main() { 6 int t; 7 while (cin >> t) { 8 int *array = new int[t]; 9 fo

HDU 1799 循环多少次?(DP+组合数学)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3984    Accepted Submission(s): 1513 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

[Irving] SQL 2005/SQL 2008 备份数据库并自动删除N天前备份的脚本

以下为SQL脚本,本人以执行计划来调用,所以改成了执行命令,大家可根据自己需要改为存储过程使用 DECLARE @bak_path nvarchar(4000)='E:\MsBackUp\SqlAutoBackup\' --备份路径; DECLARE @baktype int = 0 --备份类型为全备,1为差异备,2为日志备份 DECLARE @type int = 3 --设置需要备份的库,0为全部库,1为系统库,2为全部用户库,3为指定库,4为排除指定库; DECLARE @dbnames

汇编学习-分支与循环

在高级语言程序设计中,我们不仅要求程序可以顺序运行,还要求其可以运行不同分支,或者反复运行某些操作.在汇编语言中,相同具有相同的能力,可以由对应的指令来控制程序的运行流程.由于毕竟高级语言都是汇编实现的,仅仅是不直观而已. 转移 无条件转移为JMP.类似c语言中的 goto. 在c语言中,goto是不推荐使用的,会使程序难以控制和理解,但在汇编中,没有对应的if 和 while语句.仅仅能使用 JMP来完毕逻辑复杂的控制结构. JMP分为段内转移和段间转移.只是在windows编程上,一个代码段