雜題 洛谷P2675三角聖地
阿新 • • 發佈:2018-09-05
algorithm get char 說明 沒有 pre mat 是個 結果
題目背景
國王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 }
雜題 洛谷P2675三角聖地