2011/07/11

ジプシーダンス(ドラゴンクエスト4)のピアノ編曲

音を減らして簡単にしたけどそれでも電子ピアノじゃ上手く弾ける気が
しないので、(生ピアノで練習できるようになった時のために)とりあえずMuseScoreっていうフリーの楽譜ソフトで打ち込んでみた。何故かsfが入力できなかったり、ラ#→シ♭ ができなかったりw

一応補足
・5小節目の右手はG#を32で同音打鍵する(ラフマニのA-minorのエチュードみたいに)
・14,16,18小節目のアクセントの音は保持(4部音符を重ねて記述できなかったので)
・繰り返し後の右手の最初の2つの音はオクターブ↑

File
http://goo.gl/DNOkW 
Musescore
http://musescore.org/

2011/03/27

AAAABBBBAAAABBB

2つの文字 A, B を使って作られる長さ 15 の順列のうち次の条件を満たすものは何個あるか.
条件: 「連続する2文字の (順序) 対として AA が 5 回, AB, BA, BB が各 3 回現れる.」
例えば順列 AABBAAAABAABBBB は, AA が 5 回, AB が 3 回, BA が 2回, BB が 4 回現れるので, 上の条件を満たしていない.
1991年数オリ予選より


解けなかったので、悔しいから(&ヒマだから)プログラムで。

解答の方針はA→B、B→Aと変わる所に注目して、
ABとBAが3回出現するから
Aの”カタマリ”をa,Bのカタマリをbとすると、有り得るのは
abababa
または
bababab
の2つの場合。
両方を数え上げればおk(980通り)

細かい解説は多分どこかにあるんで検索してください。

んで、一般化したときに(上の条件はAとBだけで、4パターン全て出てる。ABCで作った列で、AB,ACが1回ずつある時のみカウントとか)力技以外で解く方法とかあるのかにゃ?


  1. #include <stdio.h>  
  2. #include <math.h>  
  3.   
  4. int N=15;  
  5.   
  6. int chk(int a[]){  
  7.    
  8.  int cntAA=0;  
  9.  int cntBB=0;  
  10.  int cntBA=0;  
  11.  int cntAB=0;  
  12.    
  13.  for(int i=1;i<=N-1;i++){  
  14.     
  15.   if(a[i]==0 && a[i+1]==0)  
  16.    cntAA++;  
  17.      
  18.   if(a[i]==0 && a[i+1]==1)  
  19.    cntAB++;  
  20.     
  21.   if(a[i]==1 && a[i+1]==0)  
  22.    cntBA++;  
  23.     
  24.   if(a[i]==1 && a[i+1]==1)  
  25.    cntBB++;  
  26.     
  27.  }  
  28.   
  29.    
  30.  if(cntAA==5 && cntAB==3 && cntBA==3 && cntBB==3){  
  31.     
  32.   return 1;  
  33.    
  34.  }else{  
  35.     
  36.   return 0;  
  37.     
  38.  }  
  39.    
  40. }  
  41.    
  42.    
  43.   
  44. int main(void)  
  45. {  
  46.   
  47.  int a[N+1];  
  48.  int count=0;  
  49.    
  50.  int MAX=pow(2,15)-1;  
  51.   
  52.  for(int n=0;n<=MAX;n++){  
  53.     
  54.   //10進数→2進数  
  55.   for(int i=1;i<=N;i++)  
  56.    a[i]=(n/(int)pow(2,i-1))%2;  
  57.     
  58.    
  59.   if(chk(a))count++;  
  60.     
  61.  }  
  62.   
  63.  printf("%d",count);  
  64.    
  65.  return 0;  
  66. }  
  67.   
  68. </math.h></stdio.h>  

2011/02/02

自然数をn乗して得られるn桁の正整数は何個あるか?

Project Eular Problem63

5桁の数 16807 = 75は自然数を5乗した数である. 同様に9桁の数 134217728 = 89も自然数を9乗した数である.
自然数をn乗して得られるn桁の正整数は何個あるか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2063

nは10-Ceiling[10^((n - 1)/n)]>=1
を満たすn=21までカウントすればおk(2項目は増加関数)。


  1. int main (int argc, const char * argv[]) {  
  2.      
  3.  double count=0;  
  4.  for(double n=1;n<=21;n++){  
  5.     
  6.   count=count+ceil(10)-ceil(pow(10,(n-1)/n));   
  7.     
  8.  }  
  9.    
  10.  printf("%f",count);  
  11.    
  12. }   


コレの原文(英語)読みながらやったら少しは英語力wがマシになるのかなーと、思いつつ、日本語約を先に読むと英文を読む気にならない。。。。

2011/01/19

レイトン教授と最後の時間旅行ナゾ123



4*4で最大いくつ置けるかって問題。数学オリンピックの過去問題にほぼ同じ問題があったので、正確に9個置ける証明を知りたい人のために。確か1974年のソ連の国内大会で、数オリ攻略本からのほぼパクリ回答です(p.164あたり)。



考え方は鳩ノ巣原理でOK
最大個数Mと配置出来たとする。
タテ4行のうち2行選んだとして、行を選ぶ総数は4C2=6行。
ある行の石の数をp_iとすると占拠する列の数は4Cp_i。
もちろん
Σ_i p_i=M
よって
Σ_i 4Cp_i <= 4C2
を満たすMを求めればOK

6 >= Σ_i (pi,2)
=Σ_i pi(pi-1)/2

12 >= Σ_i p_i(p_i-1)
=Σ_i (p_i^2-p_i)
=Σ_i (p_i^2)-M
>= (Σ_i pi)^2/4 -M (Mにしたいからコーシー・シュワルツの不等式。証明はてきとーな本みてください。)
=M^2/4-M

整理すると
M^2-4M-48 <=0
M <= 2*√13+2 ≒ 9.211
Mは整数なんで9個が最大。

間違いあったら報告お願いします。