青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-24  文章-0  trackbacks-0
給定一個非負整數n,判斷n是否表示成若干階乘的和,n = a1! + a2! + a3! + ... + ai!其中a1、a2、...、ai各不相等。
這里限定n為一個比較小的數,如1000000。

因為n比較小,可以先把i!算出來保存下來,當i為10時,10!已經比1000000大了,所以我們只需要搜索n是否能表示成1!~9!中的若干個階乘之和即可。簡單的搜索題,代碼如下:

#include <cstdio>                                                                  
                                                                                   
#define MAX 100                                                                    
                                                                                   
int a[MAX];                                                                        
                                                                                   
int init() {                                                                       
  int i = 1;                                                                       
  int res = 1;                                                                     
  while (res < 1000000) {                                                          
    a[i] = res;                                                                    
    i++;                                                                           
    res *=i;                                                                       
  }                                                                                
  return i - 1;                                                                    
}                                                                                  
                                                                                   
int is_factorial_sum(int sum, int index) {                                         
  if  (sum == 0) {                                                                 
    return 1;                                                                      
  } else if (sum < 0 || index < 0) {                                               
    return 0;                                                                   
  }                                                                                
  if (is_factorial_sum(sum - a[index], index - 1)) {                               
    return 1;                                                                      
  }                                                                                
  return is_factorial_sum(sum, index - 1);                                         
}                                                                                  
                                                                                   
int main() {                                                                       
  int len = init();                                                                
  int cases;                                                                       
  scanf("%d", &cases);                                                             
  while (cases--) {                                                                
    int n;                                                                         
    scanf("%d", &n);                                                               
    if (is_factorial_sum(n, len)) {                                                
      printf("Yes\n");                                                             
    } else {                                                                       
      printf("No\n");                                                              
    }                                                                              
  }                                                                                
  return 0;                                                                        
}

因為這里的n不大,所以可以直接暴力搜索,但是如果n非常大了怎么辦?
這里提供一個非常棒的思路:
注意到ai! > ai-1! + ai-2! + ... + a1!
這個式子非常容易證明,因為ai-1! + ai-2! + ... + a1! < (i-1)ai-1! < iai-1! = ai!
有了這個式子,我們可以非常容易得利用貪心算法,因為對于任意的n,可以從最大的階乘開始枚舉,一旦aj+1! > n && aj! < n,那么如果n可以表示成階乘之和的話那么aj!必然是其中一項!
代碼如下:

 1 #include <cstdio>                                                               
 2                                                                                 
 3 #define MAX 100                                                                 
 4                                                                                 
 5 int a[MAX];                                                                     
 6                                                                                 
 7 int init() {                                                                    
 8   int i = 1;                                                                    
 9   int res = 1;                                                                  
10   while (res < 1000000) {                                                       
11     a[i] = res;                                                                 
12     i++;                                                                        
13     res *=i;                                                                    
14   }                                                                             
15   return i - 1;                                                                 
16 }                                                                               
17                                                                                 
18 int main() {                                                                    
19   int len = init();                                                             
20   int cases;                                                                    
21   scanf("%d", &cases);                                                          
22   while (cases--) {                                                             
23     int n, i;                                                                   
24     scanf("%d", &n);                                                            
25     for(i = len; i > 0; --i) {                                                  
26       if (n == a[i]) {                                                          
27         n = 0;                                                                  
28         break;                                                                  
29       } else if (n > a[i]) {                                                    
30         n -= a[i];                                                              
31       }                                                                         
32     }                                                                           
33     if (n == 0) {                                                               
34       printf("Yes\n");                                                          
35     } else {                                                                    
36       printf("No\n");                                                           
37     }                                                                           
38   }                                                                             
39   return 0;                                                                     
40 }
posted on 2012-09-17 20:45 myjfm 閱讀(2013) 評論(0)  編輯 收藏 引用 所屬分類: 算法基礎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日本不卡高清| 羞羞色国产精品| 亚洲一区二区三区四区五区午夜| 国产毛片一区| 国产主播一区二区| 国产自产2019最新不卡| 国产日韩欧美亚洲| 加勒比av一区二区| 最新日韩中文字幕| 亚洲一区二区三区四区在线观看| 亚洲中字黄色| 免费成人毛片| 亚洲乱码国产乱码精品精天堂| 亚洲精品国产视频| 亚洲激情自拍| 欧美一区二区视频在线观看| 久久精品女人的天堂av| 欧美激情中文字幕在线| 国产伦精品一区二区三区高清| 国产专区欧美专区| 亚洲黄色尤物视频| 国产精品乱码人人做人人爱| 欧美日韩一二区| 国产精品sm| 红桃视频成人| 在线视频精品一区| 久久国产精彩视频| 亚洲电影自拍| 欧美一区二区大片| 欧美日韩国产成人在线| 一区二区在线视频播放| 亚洲免费影视| 欧美黄色免费| 亚洲欧美日韩一区| 欧美日韩a区| 1769国内精品视频在线播放| 亚洲免费在线电影| 亚洲黄色av| 久久美女性网| 国产视频亚洲精品| 亚洲免费影视| 亚洲精品乱码久久久久久| 久久精品72免费观看| 国产精品青草综合久久久久99| 亚洲青涩在线| 蜜臀久久99精品久久久久久9| 亚洲一区二区视频在线观看| 欧美另类69精品久久久久9999| 一色屋精品视频在线看| 久久久久国内| 欧美一区国产二区| 国产日产精品一区二区三区四区的观看方式| 亚洲精品乱码久久久久| 欧美.www| 噜噜噜在线观看免费视频日韩| 国产一区91| 久久久久久成人| 久久xxxx精品视频| 国内精品美女在线观看| 久久久久九九九| 久久精品国产在热久久 | 麻豆成人小视频| 韩国精品主播一区二区在线观看| 午夜伦理片一区| 亚洲欧美成人综合| 国产日韩精品一区二区浪潮av| 性欧美1819性猛交| 亚洲欧美视频一区| 国户精品久久久久久久久久久不卡 | 欧美美女视频| 一区二区三区成人| 一本久道久久久| 一本色道久久88亚洲综合88| 欧美成人一区二免费视频软件| 久久综合狠狠综合久久综合88| 禁断一区二区三区在线| 欧美大片免费看| 欧美日韩成人| 亚洲综合久久久久| 午夜精品一区二区在线观看| 国内精品美女av在线播放| 蜜臀av国产精品久久久久| 麻豆精品国产91久久久久久| 99re热这里只有精品视频| 中文亚洲免费| 韩国精品久久久999| 亚洲国产精品va| 国产精品国产自产拍高清av王其| 欧美专区在线播放| 欧美波霸影院| 亚洲欧美99| 久久久久久久综合狠狠综合| 亚洲精选91| 午夜亚洲福利在线老司机| 亚洲国产精彩中文乱码av在线播放| 亚洲国产天堂久久国产91| 国产精品视频一| 欧美激情a∨在线视频播放| 国产精品免费观看视频| 免费欧美在线视频| 国产精品二区在线| 亚洲高清视频在线| 国产精品一区二区a| 亚洲国产成人tv| 国产日韩视频一区二区三区| 亚洲电影在线播放| 国产一区二三区| 夜夜夜精品看看| 在线免费日韩片| 午夜在线成人av| 亚洲小说欧美另类社区| 麻豆精品视频| 久久免费少妇高潮久久精品99| 欧美日韩亚洲激情| 欧美高清成人| 狠狠干综合网| 亚洲欧美制服另类日韩| 99精品热视频| 欧美~级网站不卡| 毛片一区二区三区| 国产一区二区三区高清在线观看| 日韩亚洲在线| 日韩一级不卡| 欧美大片18| 欧美国产一区视频在线观看| 国产亚洲一区二区在线观看 | 国产精品二区三区四区| 亚洲激情专区| 亚洲精品免费在线播放| 美女露胸一区二区三区| 久久综合影音| 伊人成人在线视频| 久久久久九九视频| 久久久欧美精品sm网站| 亚洲国产精品一区制服丝袜| 亚洲成人直播| 亚洲一区在线观看视频 | 亚洲一级黄色| 午夜精品一区二区三区四区| 国产精品啊v在线| 亚洲无吗在线| 欧美在线播放| 国产日产亚洲精品| 欧美一区二区观看视频| 久久久99爱| 136国产福利精品导航网址| 久久夜色精品国产| 欧美激情第二页| 亚洲精品欧美在线| 欧美日产在线观看| 亚洲一区二区三区三| 久久精品国产96久久久香蕉| 国产一区视频在线看| 老**午夜毛片一区二区三区| 亚洲国产成人tv| 亚洲在线免费观看| 国产视频久久久久久久| 久久亚洲影院| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 一本久道久久久| 国产精品久久久久国产a级| 亚洲欧美日韩精品久久| 久久综合久久综合九色| 136国产福利精品导航网址应用 | 亚洲欧美日韩国产一区二区三区| 国产精品爽爽ⅴa在线观看| 欧美一区二区三区视频| 免费黄网站欧美| 亚洲一区二区伦理| 激情综合视频| 欧美色综合天天久久综合精品| 亚洲女性裸体视频| 亚洲第一黄网| 欧美在线高清| 亚洲黄色尤物视频| 国产日韩亚洲欧美精品| 欧美日韩岛国| 久久影音先锋| 亚洲自拍高清| 亚洲免费电影在线| 欧美大片在线影院| 久久精品动漫| 亚洲制服欧美中文字幕中文字幕| 狠狠色狠色综合曰曰| 国产精品vvv| 欧美成人一区二区| 久久精品欧美日韩精品| 一区二区三区视频免费在线观看| 免费观看成人| 久久gogo国模裸体人体| 一本色道88久久加勒比精品| 激情久久久久久久久久久久久久久久| 欧美日韩一区二区三区在线视频| 久久夜精品va视频免费观看| 亚洲欧美视频一区| 免费欧美电影| 女同性一区二区三区人了人一 | 亚洲性视频网站| 亚洲国产精品尤物yw在线观看| 久久久久久久一区|