1~Nを2個ずつ並べる重複順列なので(2N)!/2^N
mod Pでの階乗やべき乗、逆元を計算する関数を持っているならこれをそのまま投げても良いでしょう
#define ll long long ll pom(ll a,ll n,int m){ll x=1;for(a%=m;n;n/=2)n%2?x=x*a%m:0,a=a*a%m;return x;} #define invp(a,p)pom(a,p-2,p) ll factm(int n,int m){ll x=1;while(n)x=x*n--%m;return x;} n,m=1000000007; main(){ scanf("%d",&n); printf("%d",factm(2*n,m)*invp(pom(2,n,m),m)%m); }
少し式変形を考えるともう少し簡単になる
なので
これを使えば単なるループで書ける
i,n,s,m=1000000007; main(){ scanf("%d",&n); s=1; for(i=1;i<=n;i++)s=1L*s*i%m*(2*i-1)%m; printf("%d",s); }
無駄な1Lがなくなるようにぐっと睨んで
n,m=1e9+7;main(s){for(scanf("%d",&n);n;s=s*(2*n-1L)%m*n--%m);printf("%d",s);}
77B