您的位置:首页 > 其它

hdu5673-Robot

2016-04-28 16:52 246 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5673
好久没打BC,当时这场过了3题,hack了一个,马马虎虎吧,因为前三个题确实不难。

这个是那场的第四个题,其实难度不大。结果是ΣC(n,2i)*catalan[i],C(n,2i)好理解。

卡特兰数吗。。。。其实也不太负责,因为卡特兰数经常用在括号匹配啊啥的情况。。。参见这个吧。。
http://blog.csdn.net/hongchangfirst/article/details/8766529 http://blog.chinaunix.net/uid-26456800-id-3462158.html
当然,这题数据量比较大,建议用递推公式,涉及到求逆元,费马小定理+快速幂可以。

几个递推:Catalan[i] = ((4*i-2)/(i+1))*Catalan[i-1] , C(n, i) = ((n-i+1)/i)*C(n, i-1)。

至于网上人用的这个线性的。。。。inv[i]=(mod-mod/i)*inv[mod%i]%mod;。。。还没研究明白。。

代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1000000 + 100;
typedef long long int64;
const int64 mod = 1000000000 + 7;

int64 inv[maxn];
int64 catalan[maxn], c[maxn];

int64 fpow( int x, int64 p ){
//cout << x << "  " << p << endl;
int64 ans = 1, sum = x;
while(p){
if(p&1)
ans = (ans * sum)%mod;
sum = (sum * sum)%mod;
p >>= 1;
}

return ans;
}

void Init(void){
inv[1] = 1;
for( int i = 2; i < maxn; ++i ){
//inv[i]=(mod-mod/i)*inv[mod%i]%mod;
inv[i] = fpow(i, mod-2);
}

catalan[0] = catalan[1] = 1;
for( int i = 2; i < maxn; ++i ){
int a = 4*i-2, b = i+1;
catalan[i] = catalan[i-1]*a%mod*inv[b]%mod;
}
//cout << catalan[3] << "   " << catalan[4] << "   " << catalan[5] << endl;
}

void solve(int n){
int64 ans = 1;

c[0] = 1;
for( int i = 1; i <= n; ++i ){
c[i] = (n-i+1)*c[i-1]%mod*inv[i]%mod;
}

for( int i = 1; i*2 <= n; ++i ){
ans = (ans + c[2*i]*catalan[i]%mod)%mod;
}
printf("%I64d\n", ans);
}

int main(void){
int T;
scanf("%d", &T);
Init();

while(T--){
int n;
scanf("%d", &n);

solve(n);
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: