初学算法----分治实战问题
2011
描述:
已知长度最大为200位的正整数n,请求出2011^n的后四位。输入:
第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,每行都有一个正整数n,n的位数<=200
输出:
每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0样例输入:
3 5 28 792
样例输出:
1051 81 5521
看了大佬的题解有几个问题:
1.何为幂的重复性?
2.快速幂是?
可以使用快速幂,这样解法就属于分治;因为
2011^n ==2011^(n/2) * 2011^(n/2) ,假如n是偶数;
else
2011^n ==2011^(n/2) * 2011^(n/2) * 2011 ,假如n是奇数;
这样很容易就形成一个递归分治的解法;
最后四位,只与每次计算的最后四位有关,最后返回那四位就行了。
但是我用了这种方法后空间超时了:
#include<iostream>
#include<cstdio>
using namespace std;
int mergeway (int n)
{
int left,right;
//出口条件;
if (n==1)
{
return 2011;
}
//分,治;
if (n%2!=0)
{
left=mergeway(n/2)%10000;
right=mergeway(n/2+1)%10000;
}
else
{
left=mergeway(n/2)%10000;
right=mergeway(n/2)%10000;
}
//归;
return (left*right)%10000;
}
int main()
{
int k;
scanf ("%d",&k);
while (k--)
{
int n;
scanf ("%d",&n);
int afterfour = mergeway (n);
printf ("%d\n",afterfour);
}
return 0;
}
如何减小空间复杂度?

浙公网安备 33010602011771号