徒然煮物

知識メモ

emacs Wrong number of arguments: called-interactively-p, 1 エラー

違うPCに、自分のemacs設定ファイルを入れたら、こんなエラーが。

Wrong number of arguments: called-interactively-p, 1

コンパイルされたelcファイルが、emacsのバージョンに不適合なようです。
init.elcを消すのはもちろん、子ディレクトリのelcファイルも消すと治りました。

windows 10 wifi不調

windows 10に変えて10日ほど経ちますが,すっきりとした見栄えでとても満足しています.

ところが,新しいアップデートで突然wifiが使えなくなってしまいました.(surface pro)
ということで,私がとった修復策を書きます.

  1. デバイスマネージャを開く
  2. ネットワークアダプタタブ
  3. "Marvell AVASTAR ・・・"に異常が...

停止してしまっていたので,再開したのですが,やっぱり駄目.

  1. 右クリック,削除
  2. 再起動

再起動をすると,自動的にデバイスが検出されて再インストールされるようです.

POJ 3046 Ant Counting

問題(http://poj.org/problem?id=3046

ラベル1〜T(1\leq T \leq1000)をつけたアリがA匹います。
各々のラベルをつけたアリは、N_i匹(1\leq N_i\leq100)です。
サイズがS〜Bの異なる集合は何種類あるでしょうか。

異なる集合を数え上げたいので、各々の集合は昇順に並べられているとします。
すると、最終要素の個数によって、サイズを一つ上げた時にすべき挙動が変わることになります。
具体的には、d_{i,j}を「最終要素がラベルiで、j個含まれている集合の個数」とすると、
 j < N_i の時には、d_{i,j+1} += d_{i,j}
となります。
また、k>iなるkを最終要素に加えることで、新たな集合を作ることもできるので、コードは以下のようになりました。

#include <cstdio>
#include <iostream>
#include <vector>
#include <map>

using namespace std;

#define MAX_T 1000
#define MAX_N 100
#define MAX_A 100000
#define BASE 1000000
int T, A, B, S;
int N[MAX_T];
int dp[2][MAX_T][MAX_N];

void solve(){
  int cnt = 0;
  for(int i=0; i<T; i++){
    dp[1][i][0] = 1;
    dp[0][i][0] = 0;

    for(int j=1; j<N[i]; j++){
      dp[0][i][j] = 0;
      dp[1][i][j] = 0;
    }
  }
  int size = 2;
  while(size <= B+1){
    int sum = 0;
    for(int i=0; i<T; i++){
      for(int j=0; j<N[i]; j++){
	if(dp[(size+1)%2][i][j] > 0){
	  if(j < N[i]){
	    dp[size%2][i][j+1] += dp[(size+1)%2][i][j];
	    dp[size%2][i][j+1] %= BASE;
	  }
	  sum += dp[(size+1)%2][i][j];
	  sum %= BASE;
	  if(size>S){
	    cnt += dp[(size+1)%2][i][j];
	    cnt %= BASE;
	  }
	  dp[(size+1)%2][i][j] = 0;
	}
      }
      if(i+1<T){
	dp[size%2][i+1][0]+=sum;
	dp[size%2][i+1][0] %= BASE;
      }
    }
    size++;
  }
  cout << cnt << endl;
}

int main(){
  fill(N, N+MAX_T, 0);
  scanf("%d %d %d %d", &T, &A, &S, &B);  
  int tmp;
  for(int i=0; i<A; i++){
    scanf("%d", &tmp);
    N[tmp-1]++;
  }
  solve();
  return 0;
}

まだまだ遅いので、もっと効率のやり方があるのだろうなと思います。

POJ1742 Coins

問題 (http://poj.org/problem?id=1742)

n種類のコイン A_1,A_2,・・・A_nが、それぞれC_1, C_2, ・・・C_n枚ある。
m円以下の価格を、何種類お釣りなしに支払うことができるか。

最初は、動的計画法を用いず、setで一意性を担保し全てを足していったが案の定TLE。
個数制限付き部分和を用いたところ、通った。

#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>

using namespace std;

#define MAX_N 100
#define MAX_M 100000

int N, M;
int coin[2][MAX_N];
int dp[MAX_M+1];


void solve(){
  int cnt = 0;
  fill(dp, dp+MAX_M+1, -1);
  for(int i=0; i<N; i++){
    dp[0] = true;
    for(int j=0; j<=M; j++){
      if(dp[j] >= 0)dp[j] = coin[1][i];
      else if((j<coin[0][i]) || dp[j-coin[0][i]]<=0) dp[j] = -1;
      else dp[j] = dp[j-coin[0][i]]-1;
      if(i==N-1 && dp[j]>=0)cnt++;
    }
  }
  cout << cnt-1 << endl;
}

int main(){
  scanf("%d %d", &N, &M);
  while((N!=0) || (M!=0)){
    for(int i=0; i<N; i++){
      scanf("%d", &coin[0][i]);
    }
    for(int i=0; i<N; i++){
      scanf("%d", &coin[1][i]);
    }
    solve();
    scanf("%d %d", &N, &M);
  } 
  return 0;
}