01.
/*
02.
现在请你计算出起始有m个金片的汉诺塔金片全部移动到另外一个针上时需要移动的最少步数是多少?(由于结果太大,现在只要求你算出结果的十进制位最后六位)
03.
04.
输入
05.
第一行是一个整数N表示测试数据的组数(0<N<20)
06.
每组测试数据的第一行是一个整数m,表示起始时金片的个数。(0<m<1000000000)
07.
输出
08.
输出把金片起始针上全部移动到另外一个针上需要移动的最少步数的十进制表示的最后六位。
09.
*/
10.
#include <iostream>
11.
#include<stdio.h>
12.
#include<malloc.h>
13.
#include<stdlib.h>
14.
using
namespace
std;
15.
int
nunu(
int
a)
16.
{
17.
int
i;
18.
int
m=1;
19.
//a = a%50000;
20.
/**
21.
每次输入层数,输出移动步数,但如果输入的数据很大的时候,
22.
我们的程序肯定会超时,这里我们经过多次测试,发现如果数据
23.
大于50000的时候,会有如下规律
24.
51212 =1212+50000
25.
61212 =11212+50000
26.
71212 =21212+50000
27.
201212=1212+50000
28.
就是a=a%50000+50000
29.
这样程序就不会超时了
30.
*/
31.
if
(a>50000)
32.
a = a%50000+50000;
33.
for
(i=2;i<=a;i++)
34.
{
35.
/**
36.
汉诺塔的计算移动步数的公式是
37.
f(n+1)=f(n)*2+1;
38.
因为题设是保留最后六位数字,
39.
所以我们的m的值为:
40.
f(n+1)=(f(n)*2+1)%100000;
41.
*/
42.
m = m*2+1;
43.
m = m%1000000;
44.
}
45.
return
m;
46.
}
47.
int
main()
48.
{
49.
int
a;
50.
int
n;
51.
scanf
(
"%d"
,&n);
52.
while
(n--)
53.
{
54.
scanf
(
"%d"
,&a);
55.
printf
(
"%d\n"
,nunu(a));
56.
}
57.
return
0;
58.
}