码迷,mamicode.com
首页 > 其他好文 > 详细

GZS的三角形

时间:2017-09-02 00:16:29      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:整数   机智   bsp   signed   ima   多少   std   pow   height   

GZS的三角形

发布时间: 2015年9月6日 15:18   最后更新: 2016年6月26日 12:10   时间限制: 1000ms   内存限制: 256M

机智无比的G神今天完成了一天的任务,实在是无聊的紧,拿起一支笔在纸上画起了三角形,边长为1, 2, 3,.........

 技术分享

即使是无聊到这种程度,G神发达的大脑也在不停的思考,从顶部的点到沿着所画出的边到达底边的方案有多少种呢。

结果可能比较大, 结果对1000003取余。

例如,边长为2的情况如下所示:

技术分享

第一行有一个整数 T (1 <= T <= 1000) ,是三角形的个数。
接下来T行,每行一个整数 N (1 <= N <= 10^18),代表三角形边长。

输出T行,每行代表方案数,结果对1000003取余。

复制
3
1
2
3

2
8
48

 

 

一道找规律好题?

先给出答案通项吧。

\( ans_n = n! \times 2^n \)

再来给出解释——

我们可以把其看作一个DP,有

\( ans_n = 2n \times ans_{n-1} \)

考虑到达n-1的底层的每个方案,在其基础上有多少方案到达n的底层呢?

不难发现,对于一个到达n-1的底层某个固定点的方案,到n的底层中间的n-1个点(除了最左和最右点),都有且仅有两种方案,即最后一步是↘或最后一步是↙。而最左和最右都只有一种方案,加起来就是\( 2 \times (n-1) + 1 + 1 = 2 \times n \)。

然后,考虑编程问题,n!可以暴力递推前1000002项,而当\( n \geq 1000003 \)时,n!在模意义一定为0。至于\( 2^n \),写个快速幂就好了。

 

 1 #include <cstdio>
 2 
 3 #define int long long
 4 
 5 const int mxn = 1000010;
 6 const int mod = 1000003;
 7 
 8 int n, cas, fac[mxn];
 9 
10 inline int pow(int a, int b) {
11     int r = 1;
12     for (; b; b >>= 1) {
13         if (b & 1)
14             r = r * a % mod;
15         a = a * a % mod;
16     }
17     return r;
18 }
19 
20 signed main() {
21     fac[0] = 1;
22     for (int i = 1; i < mod; ++i)
23         fac[i] = i * fac[i - 1] % mod;
24     for (scanf("%lld", &cas); cas--; )
25         if (scanf("%lld", &n), n < mod)
26             printf("%lld\n", fac[n] * pow(2, n) % mod);
27         else
28             puts("0");
29 }

 

GZS的三角形

标签:整数   机智   bsp   signed   ima   多少   std   pow   height   

原文地址:http://www.cnblogs.com/kenro/p/7465412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!