初学算法----分治实战问题

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;
}
如何减小空间复杂度?
posted @ 2021-12-22 23:29  次林梦叶  阅读(79)  评论(0)    收藏  举报