题目背景

国王1带大家到了数字王国的中心:三角圣地。

题目描述

不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成。这个倒三角的顶端有一排数字,分别是1~N。1~N可以交换位置。之后的每一行的数字都是上一行相邻两个数字相加得到的。这样下来,最底端就是一个比较大的数字啦!数字王国称这个数字为“基”。国王1希望“基”越大越好,可是每次都自己去做加法太繁琐了,他希望你能帮他通过编程计算出这个数的最大值。但是这个值可能很大,所以请你输出它mod 10007 的结果。

任务:给定N,求三角形1~N的基的最大值 再去 mod 10007。

输入输出格式

输入格式:

 

一个整数N

 

输出格式:

 

一个整数,表示1~N构成的三角形的最大的“基”

 

输入输出样例

输入样例#1: 复制
4
输出样例#1: 复制
24
输入样例#2: 复制
1125
输出样例#2: 复制
700

说明

数据:

20% 0<=N<=100

50% 0<=N<=3000

100% 0<=N<=1000000

样例解释:

1 3 4 2

4 7 6

11 13

24 是N=4的时候的最大值,当然还有别的构成形式。

PS:它叫做三角圣地,其实它就是个三角形~

本题数据已经更新,目前全部正确无误!

不要面向数据编程!

  这道题是一个最简单的Lucas的板子。但是我由于lucas在调用C(n,m)的时候没有考虑n < m 的情况。可以说非常尴尬。

  都是板子,没什么好讲的,线性跑一遍阶乘的逆元,再直接按组合数乘就行。

  代码如下:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn = 1e6 + 5;
 8 const ll mod = 1e4 + 7;
 9 ll read()
10 {
11     ll a = 0,b = 1;
12     char c = getchar();
13     while(c < '0' or c > '9')
14     {
15         if(c == '-') b = -1;
16         c = getchar();
17     }
18     while(c >= '0' and c <= '9')
19     {
20         a = a * 10 + c - '0';
21         c = getchar();
22     }
23     return a * b;
24 }
25 ll c[maxn],n,j[maxn],ans,t;
26 ll quickpow(ll a, ll b)
27 {
28     ll base = a;
29     ll ans = 1;
30     while(b != 0)
31     {
32         if(b %2 == 1){
33         ans *=base;
34         ans %= mod;
35     }
36         base *= base;
37         base %= mod;
38         b/=2;
39     }
40     return ans % mod;
41 }
42 ll C(ll a, ll b)
43 {
44     if(a < b) return 0;
45     return   j[a] * (c[a-b] * c[b] % mod) % mod;
46 }
47 ll lucas(ll a, ll b)
48 {
49     if(a < mod && b < mod)
50         return C(a, b) % mod;
51     return
52         C(a % mod, b % mod) * lucas(a / mod, b / mod) % mod;
53 }
54 int main()
55 {
56 //    freopen("fds.in","r",stdin);
57 //    freopen("fds.out","w",stdout);
58     cin >> n;//n = read();
59     c[0] = 1;
60     j[0] = 1;
61     c[1] = 1;
62     j[1] = 1;
63     for(int i=2; i<mod; i++)
64     {
65         j[i] = j[i-1] * i % mod;
66     }
67     c[mod-1] = quickpow(j[mod-1],mod-2) % mod;
68 
69     for(int i=mod-2; i>=1; i--)
70     {
71         c[i] = (c[i+1] * (i+1)) % mod;
72     }
73     for(int i=1; i<=n; i++)
74     {
75         ll m = n-1;
76         if(i %2 == 0) t = i/2 - 1;
77         else t = i/2;
78         if(t == 0) ans+=i;
79         else ans += (lucas(m,t) * (i % mod))%mod;
80         ans %= mod;
81         //printf("%d %lld %lld\n", i, lucas(m,t), ans);
82         //printf("%d %d %d %d %d\n",i,t,c[t],c[n-t-1],j[n-1] * (c[t] * c[n-t-1] % mod) % mod);
83     }
84     //printf("%I64d",ans);
85     //cout << ans << endl;
86     printf("%lld",ans);
87     return 0;
88 }