読者です 読者をやめる 読者になる 読者になる

プログラミング雑記:ARC034、あとJavaとか

・ARC034Cだった
 ARC034C:http://arc034.contest.atcoder.jp/submissions/342262
 解説:http://www.slideshare.net/chokudai/arc034
 素因数分解して約数の総数を出しましょうよという問題。そもそも解答が正確に考えられてなかったので時間内には解けませんでしたちゃんちゃん。素因数分解したくない……って念じてたら正しいことが考えられなかった。いざ書くと簡単という。
 あとは連想配列の使い方ね。mapというのがそれです。知らなかった。ちなみに単なる集合はそのままsetというやつを使えばよろしい。

int main() {
  int a,b; cin >> a >> b;
  ll res = 1;
  //せんげん map<type,type> name;
  map<int,int> m;
  //いてれーた
  map<int,int>::iterator itr;
  for (int i = b + 1; i <= a; i++) {
    int x = i; //値がりがり削るから別の変数にコピーしないとね
    //素因数分解
    for (int j = 2; j * j <= a; j++) {
      while (x % j == 0) {
        m[j]++; //key=jのvalueをインクリメントする
        x /= j;
      }
    }
    if (x != 1) m[x]++; //余った素数も忘れずに
  }
  //いてれーたの使い方 itr->firstがkey、itr->secondがvalue
  for (itr = m.begin(); itr != m.end(); itr++) {
    res = res * (itr->second + 1) % 1000000007;
  }
  cout << res << endl;
  return 0;
}


Javaの絵本を読んだ
 ちょっと事情があったので読んだ。オブジェクト指向の入門だなという印象。踏み込んだ説明はなかったので逆にC#との違いがほとんどないんじゃないかとか思った。インスタンスとかオブジェクトとかインスタンス化とか区別が厳密にあるのかもしれないけどこだわっても仕方なさそう……?
- クラスのインスタンスが作成される時に実行されるメソッドコンストラクタという(クラス内ではクラス名と同名のメソッドとして記述される)
- Javaでは(?)メンバ変数のことをフィールドと呼ぶ
- 同名のメソッドを異なる引数の数や型で書くことをオーバーロードという
- class A extends B {...} クラスBを継承したクラスA
- final修飾子をつけるとフィールドは定数になる、クラスは継承できなくなる
- static修飾子をつけたらインスタンスを作らなくてもクラス名から直接アクセスできる、どのインスタンスでも値が共有される
- staticメソッドは非staticメソッドではオーバーライド(継承したメソッドの上書き)できない
- staticメソッドから同じオブジェクト内のフィールドやメソッドを参照するときは参照される方もstaticである必要がある
- 関数名だけを定義したメソッドを抽象メソッドと呼び、抽象メソッドを持つクラスのことを抽象クラスと呼ぶ
- abstract class A { abstract void f(); ... } 抽象クラスAの宣言と抽象メソッドfの宣言
- 抽象クラスは継承して使い、抽象メソッドをオーバーライドして具体的な処理を記述する
- インターフェースは実装する利点がよくわからなかったから別のもので見なおしたほうがいいと思いました