/*杭电汉诺塔III
此题是在经典汉诺塔的问题上改为每次只能移到附近塔上,
求A塔移动到C塔的最小次数。
a[n]=a[n-1]+1+a[n-1]+1+a[n-1];先把上面的n-1个移到c,
再将最大的移动到b,此时所需步骤是a[n-1]+1;
然后将n-1个移动到b,再移到a,最后将最大的移动到c,此时所需步骤a[n-1]+1;
最后将n-1个移到c,需要a[n-1]次; */
#include<stdio.h>
int main()
{
__int64 x[100]={0,2};
int n,i;
for(i=1;i<36;i++)
x[i]=3*x[i-1]+2;
while(scanf("%d",&n)!=EOF)
{
printf("%I64d\n",x[n]);
}
return 0;
}
此题是在经典汉诺塔的问题上改为每次只能移到附近塔上,
求A塔移动到C塔的最小次数。
a[n]=a[n-1]+1+a[n-1]+1+a[n-1];先把上面的n-1个移到c,
再将最大的移动到b,此时所需步骤是a[n-1]+1;
然后将n-1个移动到b,再移到a,最后将最大的移动到c,此时所需步骤a[n-1]+1;
最后将n-1个移到c,需要a[n-1]次; */
#include<stdio.h>
int main()
{
__int64 x[100]={0,2};
int n,i;
for(i=1;i<36;i++)
x[i]=3*x[i-1]+2;
while(scanf("%d",&n)!=EOF)
{
printf("%I64d\n",x[n]);
}
return 0;
}
杭电 Rightmost digit
快速幂顾名思义,就是快速算某个数的多少次幂:
用到的理论:
1·ab mod c = (a mod c)b mod c
即积的取余等于取余的积的取余。
2. 如果b是偶数,a^a mod c=(a^2)^b/2 mod c;
3. 如果b是奇数,a^a mod c=(((a^2)^b/2)*a)mod c;*/
#include<stdio.h>
int main()
{
int f(int a,int b,int c);
int n,t;
scanf("%d",&n);
while(n--)
{
scanf("%d",&t);
printf("%d\n",f(t,t,10));
}
return 0;
}
int f(int a, int b, int c)
{//a为底数,b为指数,此处c为10,求最右边那位数
int m = 1;
a = a % c;//求a的最右边那位数
while( b>0 )
{
if( b % 2 == 1 )//若b为奇数次幂,则m=a(a右边那位数)
m = ( m * a ) % c;
b = b / 2;//再进行b/2;
a = ( a * a ) % c;//对a后边的那位再进行取余
}
return m;
}
快速幂顾名思义,就是快速算某个数的多少次幂:
用到的理论:
1·ab mod c = (a mod c)b mod c
即积的取余等于取余的积的取余。
2. 如果b是偶数,a^a mod c=(a^2)^b/2 mod c;
3. 如果b是奇数,a^a mod c=(((a^2)^b/2)*a)mod c;*/
#include<stdio.h>
int main()
{
int f(int a,int b,int c);
int n,t;
scanf("%d",&n);
while(n--)
{
scanf("%d",&t);
printf("%d\n",f(t,t,10));
}
return 0;
}
int f(int a, int b, int c)
{//a为底数,b为指数,此处c为10,求最右边那位数
int m = 1;
a = a % c;//求a的最右边那位数
while( b>0 )
{
if( b % 2 == 1 )//若b为奇数次幂,则m=a(a右边那位数)
m = ( m * a ) % c;
b = b / 2;//再进行b/2;
a = ( a * a ) % c;//对a后边的那位再进行取余
}
return m;
}