NC19857. 最后的晚餐(dinner)
描述
输入描述
一行一个正整数N,表示cp的对数。
输出描述
一行一个非负整数,表示答案对1000000007取模后的值。
示例1
输入:
2
输出:
2
说明:
两种方案:示例2
输入:
25
输出:
535659175
示例3
输入:
1000000
输出:
270258012
说明:
对于20%的数据,1<=N<=5C++14(g++5.4) 解法, 执行用时: 461ms, 内存消耗: 416K, 提交时间: 2019-11-14 18:55:51
#include<cstdio> typedef long long ll; const int mod=1e9+7; int n; ll ans=1,a,b,c; int main() { scanf("%d",&n); if(n==1){puts("0");return 0;} a=1;b=n-2; for(int i=2;i<=n;i++) c=(b*(ll)(n+i-3)+a*(ll)(i-1<<1))%mod,a=b,b=c; for(int i=2;i<n;i++) ans=ans*(ll)i%mod; ans=ans*c%mod; printf("%lld\n",ans); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 448ms, 内存消耗: 592K, 提交时间: 2018-10-29 00:13:23
#include<bits/stdc++.h> const int mod=1e9+7; int n;long long a,b,c,ans=1; int main() { scanf("%d",&n); if(n==1){puts("0");return 0;} a=1;b=n-2; for(int i=2;i<=n;i++)c=(1ll*b*(n+i-3)+2ll*a*(i-1))%mod,a=b,b=c; for(int i=2;i<n;i++)ans=1ll*ans*i%mod; printf("%lld\n",1ll*ans*c%mod); return 0; }