杭电ACM 1097 题老是Time Limit Exceeded

来源:百度知道 编辑:UC知道 时间:2024/05/26 09:01:46
用几种方式处理都是Time Limit Exceeded
希望高手帮我看下
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1097

我的代码:
#include<stdio.h>

int main()
{
int i,a,b,s,temp,l,c[11];

while(scanf("%d%d",&a,&b)!=EOF)
{
temp=10000000000;
for(i=1;i<=10;i++)
{
c[i]=a/temp;
a=a%temp;
temp=temp/10;
}
s=c[10];
for(i=0;i<b-1;i++)
{
temp=s*(c[10]);
s=temp%10;
}
printf("%d\n",s);
}
return 0;
}

b的值最大有2^30
一次遍历下来当然会T咯

看看我的代码把

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
int a, b;
int s[10][10] = {
{1, 0},
{1, 1},
{4, 2, 4, 8, 6},
{4, 3, 9, 7, 1},
{2, 4, 6},
{1, 5},
{1, 6},
{4, 7, 9, 3, 1},
{4, 8, 4, 2, 6},
{2, 9, 1}
};
while(2 == scanf("%d %d", &a, &b))
{
a %= 10;
b %= s[a][0];
if(!b)
b = s[a][0];
printf("%d\n", s[a][b]);
}
return 0;
}

题目求a^b的最后一位,这是一个数学问题,要用数学方法解决。
首先,a对结果的影响只有个位,所以前面的位都可以忽略了。
其次,b对结果的影响应该是循环的,所以对结果也不用循环b次。
下面通过Sample Input介绍一下:
7 66
7(b=1)
7*7=49(b=2)
9*7=63(b=3)
3*7=21(b=4)
1*7=7(b=5)
循环了,循环的大小是4。b=5的结果就是b=1的结果;b=4的结果就是b=0的结果.
66/4=16......2
所以答案就是9.

具体实现,编程前先手工完成两个表