24h購物| | PChome| 登入
2009-05-08 18:58:26| 人氣506| 回應0 | 上一篇 | 下一篇

古代神祕文字

推薦 0 收藏 0 轉貼0 訂閱站台

作法:數學 組合(巴斯卡三角形)
想法:1.先將C(3000,n-1)前面(含)的組合算好 2.請參考下面
說明:C(N,M) 代表N取M的組合 這樣OK嗎? 數據可能會有錯誤 不過大致上的想法是這樣 數據錯誤請幫忙修改 我頭好痛...測試了好久...
ex:
3
12 34 56

      56
       .
       .
      35 (這邊直接加就可以了)
   34
   33 C(2966,1)
    .
    .
    .
   13 C(2986,1)
12
11 C(2988,2)
10 C(2987,2)
9  C(2986,2)
.
.
.
1  C(2998,2)
0  C(2999,2) 2999 是1~2999 的個數去做組合 2是後面有2個位子可以選

 

/*************************************************************/

#include<stdio.h>
#include<stdlib.h>
#define N 10000000
int math[3001][3001]={0};
main()
{
 int a,b,c;
 math[1][1]=1;
 for(a=0;a<3001;a++)  math[a][0]=1;
 for(a=2;a<3001;a++)
  {
   for(b=1;b<a;b++)
     math[a][b]=(math[a-1][b-1]+math[a-1][b])%N;
    math[a][b]=1;
  }
 int n;
 while(scanf("%d",&n)!=EOF)
  {
    int num[3000],ans=0,before=0;
    for(a=0;a<n;a++) scanf("%d",&num[a]);
    for(a=0;a<n-1;a++) before=(before+math[3000][a+1])%N;
    for(a=0;a<n-1;a++)
       {
         if(a-1>=0)
         for(b=num[a-1]+1;b<num[a];b++)
           {
            ans=(ans+math[3000-b-1][n-a-1])%N;
           }
         else
         for(b=1;b<=num[a];b++)
           {
            ans=(ans+math[3000-b][n-a-1])%N;
           }
       }
    if(n>1)
     ans=(ans+num[n-1]-num[n-2])%N;
    else
     ans=num[0]+1;
    printf("%07d\n",(ans+before)%N);
  }
 return 0;
}

台長: 來源不明

您可能對以下文章有興趣

人氣(506) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:退休的福利
此分類上一篇:加法減法的奧妙

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文