感觉自己数学推理题真的太差劲了…
原题
思路:这种题大概可以知道与动态规划或者数学规律有关,所以要先搞几个例子递推试一下,同时注意与前一项的联系(图形上,数字上)
从图可知,每一项都与前一项有关,我们又发现前一项得到的仅仅是到各个终点的方案数,但缺少了各个终点之间的路径,所以就在到达原本终点的方案数×2的基础上,再加上 到达原本终点方案数×(N-1)×2 ,合并起来就是dp[i-1]×i×2
这里(N-1)是经过横线到达其他原终点的方案数
我画到n=3并且大致算了一下
n=1, 1×2
n=2, 2×2+2×2=2×2×2
n=3, 8×2+8×2×2=8×2×3
n=4, 48×2+48×3×2=48×2×4
#include<iostream>
int dp[1000003];
using namespace std;
int main()
{
long long n,i,cas;
dp[1]=2;
for(i=2;i<=1000002;i++)
{
dp[i]=dp[i-1]*2*i%1000003;
}
cin>>cas;
while(cas--)
{
cin>>n;
if(n>=1000003) cout<<'0'<<endl;
else cout<<dp[n]<<endl;
}
return 0;
}