【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;
}