1. 程式人生 > >雜題 洛谷P2675三角聖地

雜題 洛谷P2675三角聖地

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三角聖地