题目背景
国王1带大家到了数字王国的中心:三角圣地。
题目描述
不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成。这个倒三角的顶端有一排数字,分别是1~N。1~N可以交换位置。之后的每一行的数字都是上一行相邻两个数字相加得到的。这样下来,最底端就是一个比较大的数字啦!数字王国称这个数字为“基”。国王1希望“基”越大越好,可是每次都自己去做加法太繁琐了,他希望你能帮他通过编程计算出这个数的最大值。但是这个值可能很大,所以请你输出它mod 10007 的结果。
任务:给定N,求三角形1~N的基的最大值 再去 mod 10007。
输入输出格式
输入格式:
一个整数N
输出格式:
一个整数,表示1~N构成的三角形的最大的“基”
输入输出样例
说明
数据:
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
", i, lucas(m,t), ans);
82 //printf("%d %d %d %d %d
",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 }