【HDOJ】4704 Sum

【题目】 http://acm.hdu.edu.cn/showproblem.php?pid=4704

【报告】

    S(K)显然就是N的K正整数划分数。所以SUM{S(K),1<=K<=N}=C(0,N-1)+C(1,N-1)+...+C(N-1,N-1)=2^(N-1)。

    N很大,是一个高精度数。求这个幂,网上有很多算法,我自己想了一个:

    2^(A*10+B)=(2^A)^10*2^B  (A,B是任意自然数,0<=B<=9)

    X^10=((X^2)^2*X)^2   (这个是快速幂)

    嗯,然后从高位到低位做一遍就可以了,一次AC。复杂度O(lgN)

【程序】

// Task: 4704 Sum
#include
#include
#include
#include
#include
using namespace std;
const long long modi=1000000007;
long long e2[10];
string n;
long long ans;
inline long long sqr(long long x)   // 求x^2
{
    return (x*x)%modi;
}
inline long long calc(long long x)  // 求x^10
{
    return sqr(sqr(sqr(x))*x%modi);
}
int main()
{
    e2[0]=1;
    for (int i=1;i<=9;i++)
        e2[i]=e2[i-1]*2;
//    for (int i=0;i<=9;i++)
 //       cout << e2[i] << " ";
 //   cout << endl;
    while (cin >> n)
    {
        n[n.length()-1]--;
        for (int i=n.length()-1;i>=0;i--)
            if (n[i]<'0')
            {
                n[i]+=10;
                n[i-1]--;
            }else break;
    //    cout << "N=" << n << endl;
        ans=1;
        for (int i=0;i
            ans=(calc(ans)*e2[n[i]-'0'])%modi;
        cout << ans << endl;
    }
    return 0;
}

posted @ 2013-08-26 14:19  为美好世界献上珂学  阅读(145)  评论(0)    收藏  举报