http://acm.hdu.edu.cn/showproblem.php?pid=4828
Grids
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
当时是手写了前五项,发现这是一个卡特兰数的典型应用。
第一次交了质因数分解版本的...但是复杂度达到O(TN)
后来想到卡特兰数的递推公式
A[n]=a[n-1]*(4*n-2)/(n+1);
又因为题目中的取模的数本身就是一个大质数,直接可以用逆元的方法求解复杂度为O(TlogN)。
code:
#include<cmath> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #define ll __int64 using namespace std; ll q[1000005],ca; int cnt,n,m,t,qq; void egcd(int a,int b,int &x,int &y) { if(b==0) { x=1,y=0; return ; } egcd(b,a%b,x,y); int t=x; x=y,y=t-a/b*y; return ; } int main() { q[1]=1; n=1000000; m=1000000007; ll now=1; for(int i=2;i<=n;i++) { int t=4*i-2; now=(now*t)%m; t=i+1; int x,y; egcd(t,m,x,y); x=(x+m)%m; now=(res*x)%m; q[i]=now; } scanf("%d",&t); while(t--) { scanf("%d",&n); printf("Case #%I64d:\n",++ca); printf("%I64d\n",q[n]); } return 0; }