くれなゐの雑記

例を上げて 自分で手を動かして学習できる入門記事を多めに書いています

Undertale ubuntuのsaveファイルの場所

Gルート後、Gルート用のsaveファイルになってしまうらしい
とにかく, saveファイルをリセットしたい時がある

ところで, このゲームすごいストーリーが面白くて、英語が難しい
英語の勉強に使っているのだがかれこれ12時間英語漬け
いい英語の教材を買ったかもしれない

場所は

.config/UNDERTALE_linux_steamver

ABC042 D いろはちゃんとマス目

やること

Abstruct

長方形の通れない場所の右の部分と上の部分の2つに分割して、 (0,0) \rightarrow (i, H-A-1) \rightarrow (W, H), i = [B,W]
の経路の数を, すべてのiで計算して, sumすればよい。(上下にわけられた長方形の間の移動は, 1通りの経路のみ)

(0,0) \rightarrow (X,Y) へ移動する経路の数は,

\begin{eqnarray*}
  && {}_{X+Y} \mathrm{C} _X
\end{eqnarray*}
で求めることができる。
これは、 \mathcal{O}(N) で前処理をしておいて, 後で \mathcal{O}(1)で求める

その具体的な方法は http://hos.ac/slides/20130319_enumeration.pdf この記事を参照するとわかりやすい.

ここでは深く言及しない。

SourceCode

const int MOD = 1e9 + 7;
 
// x^n % mod
// O(log n)
template<typename T>
T mod_pow(T x, T n, T mod) {
	T res = 1;
	while (n > 0) {
		if (n & 1) res = res * x & mod;
		x = x*x %mod;
		n >>= 1;
	}
	return res;
}
 
// fact(n)%MOD, invFact(n)%MOD, inv(n)%MOD, nCk
// Constructor O(N)
// other O(1)
template<typename T, int MOD>
class Choose {
public:
	vector<T> fact, inv, invFact;
 
	Choose(T N):fact(N), inv(N), invFact(N){
		inv[1] = 1;
		FOR(i, 2, inv.size()) inv[i] = MOD - (MOD / i) * inv[MOD%i] % MOD;
		fact[0] = invFact[0] = 1;
		FOR(i, 1, fact.size()) {
			fact[i] = fact[i - 1] * i % MOD;
			invFact[i] = (invFact[i - 1] * inv[i]) % MOD;
		}
	}
 
	//Get nCk
	T operator () (T n, T k) const {
		if (not ((T)0 <= k and k <= n)) return 0;
		return (((fact[n] * invFact[k]) % MOD)*invFact[n - k]) % MOD;
	}
};
 
ll f(ll x , ll y, const Choose<ll, MOD>& c) {
	return c(x + y, x);
}
 
signed int main(void) {
	ll H, W, A, B; cin >> H >> W >> A >> B;
	Choose<ll, MOD> c(H + W);
 
	ll ans = 0;
	FOR(i, B, W + 1) {
		ans += f(H - A - 1, i, c) * f(A - 1, W - 1 - i, c);
		ans %= MOD;
	}
 
	cout << ans << endl;
 
	return 0;
}

天下一プログラマーコンテスト2016 予選A C問題 山田山本問題

要約

A_i < B_i, i=1,2,...,N となるように アルファベットの順番を出力する。
アルファベットの順番は辞書順最小のものを出さないといけない

やること

要約

1. AとBを左端から同じ位置にある文字を1文字ずつ比較して違うタイミングでa->bに有向グラフを張る
2. 明示的に、値が小さい方から取り出すトポロジカルソートを使用する.

  • A>B and A.size() != B.size() and グラフを貼れなかったとき: -1
  • グラフが閉路を含んでいる時: -1
  • 辺を張らなかった頂点も, 孤立した単独の頂点として取り扱う。

トポロジカルソート

有向グラフがすべて一方向を向くように、ノードを並べる。
DFSの方法とKhanのアルゴリズムがある。
トポロジカルソート - Wikipedia

memo
  • Khanのアルゴリズムを実装
  • 今回は, priority_queueでアルファベットが小さい順に取り出していく.
  • 辺の削除はコストが掛かりそうなので, 入力辺の数を数えて, 減らしていきながら数を数えた(∵それぞれの辺は一度しか使用されないため)
  • max(残りの入力辺の数) != 0 ならば, 閉路がある(-1を出力する。)

SourceCode

#include <iostream>
#include <queue>
#include <map>
#include <list>
#include <vector>
#include <string>
#include <limits>
#include <cassert>
#include <fstream>
#include <cstring>
#include <bitset>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <cstdio>
#include <ciso646>
#include <array>
#include <cmath>

using namespace std;

#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)

#define inf 0x3f3f3f3f
#define uinf 0x3f3f3f3f3f3f3f3f
#define CLEAR(a) a = decltype(a)()
#define MP make_pair
#define ALL(a) (a).begin(),(a).end()
#define pii pair<int ,int>
#define pcc pair<char,char>
#define pic pair<int,char>
#define pci pair<char,int>
#define VS vector<string>
#define VI vector<int>
#define VVI vector<vector<int>>
#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define pi 2*acos(0.0)
#define INFILE() freopen("in.txt","r",stdin)
#define OUTFILE() freopen("out.txt","w",stdout)
#define ll long long
#define ull unsigned long long
#define eps 1e-14
#define FIN std::ifstream cin("D:\input.txt")
const int MOD = 1e9 + 7;

// @brief topological sort (Khan's algorithm O(|V|+|E|))
// @param G[node] = {to} (G: adjacency list)
// @return sorted values (if G is closed: {})
template<class T>
vector<T> tsort(const vector<vector<T> >& G) {
	vector<T> res;
	vector<T> in(G.size());
	for (auto &node : G) for (auto &to : node) ++in[to];

	priority_queue<int, vector<int>, greater<int>> que;
	REP(i, in.size()) if (in[i] == 0) que.push(i);

	while (not que.empty()) {
		int n = que.top(); que.pop();
		res.push_back(n);
		for (auto &to : G[n]) if (--in[to] == 0) que.push(to);
	}
	return *max_element(ALL(in)) == 0 ? res : vector<T>();
}

signed int main(void) {
	int N; cin >> N;
	vector<vector<int> > G('z'-'a'+1);
	vector<bool> check('z' - 'a' + 1);
	REP(i, N) {
		string A, B; cin >> A >> B;
		int size = min(A.size(), B.size());
		bool isPush = false;
		REP(j,size) {
			if (A[j] != B[j]) {
				check[A[j] - 'a'] = true;
				check[B[j] - 'a'] = true;
				G[A[j]-'a'].push_back(B[j]-'a');
				isPush = true;
				break;
			}
		}
		if (A > B and A.size() != B.size() and (not isPush)) {
			cout << -1 << endl;
			return 0;
		}
	}

	vector<int> res = tsort<int>(G);

	if (res.size() == 0) cout << -1 << endl;

	else {
		for (auto &a : res) cout << (char)(a + 'a');
		cout << endl;
	}

	return 0;
}

ubuntuでterminalを強化したけどいろいろ躓いたメモ

Motivation

後輩がfishを使っていたので、これは便利そうだということで、そろそろterminalを強化してみようと思った
以下を参考に、強化したのだが、いろいろ躓いたところがあるのでメモを残す
各コマンドのチェックはwhichコマンドで

環境 Ubuntu16.04

qiita.com

Content

brewの代わりにaptを使用する.
oh-my-fishのリポジトリが変わっている

github.com


現在インストール方法はこう

curl -L https://github.com/oh-my-fish/oh-my-fish/raw/master/bin/install | fish
agnosterfishテーマは,
 omf install agnoster

のみで良い

powerline/fontsのリポジトリも変わってる

github.com

tmuxは一応ソースビルド

automakeとlibevent-devが必要

 sudo apt install automake
 sudo apt install libevent-dev

入ったらこれ

 git clone https://github.com/tmux/tmux
 sh autogen.sh
 ./configure && make
 sudo make install
pecoはaptじゃあ入らない
sudo apt install golang
export GOPATH=$HOME/go # .bashrcにも追加しておくこと
export PATH=$PATH:$GOROOT/bin # .bashrcにも追加しておくこと
go get github.com/peco/peco/cmd/peco
fish
omf install peco

その他functionなど参考
qiita.com

powerlineも変わってる

github.com

sudo apt install python-pip
pip install powerline-status==2.4
sudo pip psutil
zコマンドがよくわからない

kurenaif.hatenablog.com

powerlineの下にbranch名などを表示させたい

matsu.teraren.com

dotファイルはこれを参考にした
github.com

ubuntuでfish(oh-my-fish導入済み)でz

タイトル通り ubuntuでfishでzコマンドが使いたい

1. z.shを持ってきます。

 git clone https://github.com/rupa/z
 cp z/z.sh /usr/local/bin/

2. z.shのパスを指定

~/.config/fish/config.fish に 以下を追加

 set -gx Z_SCRIPT_PATH /usr/local/bin/z.sh

3. omf

 omf install z

これでfish上でzコマンドが動きます

4. z-fish (2016-10-29追記)

こいつも導入しておくひつようがあるっぽいです

`git clone`をして, `.config/fish/functions`内に`z.fish`を入れてあげる

github.com

参考文献

github.com
qiita.com

プレゼンツールメモ(主にmarkdown->pdf)

Motivation

最近、研究室に所属しプレゼンをすることが多くなりました。
以前はPowerpointを中心に使用してプレゼン発表をしていたのですが、
数式がださかったり、ソースコードの貼り付けに難があったりといろいろ問題が発生し、
markdownを使用して簡易的な進捗報告をスマートにかつスムーズに作れたらと思いいろいろ調べたのでまとめます。

使い分け

現在、以下の3つのソフトを使い分けています

1. Powerpoint
スライド プレゼンテーション ソフトウェア - Microsoft PowerPoint

2. Marp
yhatt.github.io

3. pandoc
Pandoc - About pandoc

3つとも, 現在(2016-07-14)それぞれ一長一短があります

1. powerpoint: 動画や画像の挿入が楽, 数式がダサく, ソースコードの挿入が難
2. Marp: markdownで表記できて, リアルテイムプレビュー, ソースコードの挿入が楽で画像の挿入が比較的楽, 数式がまだ未対応で、動画が不可
3. pandoc: markdownからtexに変換してpdfにするのに使用する奴, beamerな感じのスライドができる. エディタによるけど画像の挿入がめんどう. 動画は不可

texでも頑張ったら動画を挿入できるそうですが, (高専の時の)先生はそういうときはめんどうなのでpowerpoint使ってるって言ってました。

なので以下のように使い分けをします

1. powerpoint: 動画を挿入するとき。 画像の挿入が多い時
2. Marp: ソースコードやプログラミング中心の発表をするとき
3. pandoc: 数式中心で説明するとき

Marpの数式は将来的に対応するっぽいです(Githubのissueを見る限り)
現在pandocを使用しているのは数式のためなので、対応したらMarpに移行します。

markdown->pandocでスライドを作る

基本方針は, 以前の記事を参考にします。
kurenaif.hatenablog.com

デフォルトでは、日本語が対応していないらしく、このページを参考に以下のファイルを"h-luatexja.tex"という名前で保存しました。

\usepackage{luatexja}
\hypersetup{unicode=true}
\bigskip\hrule\setbeamertemplate{items}[default]

3行目は, 下のコマンドのthemeだとitem(箇条書きのやつ)がかなり見難いものになっていたので、それをデフォルトの見やすいやつに変更するコマンドです。

beamerを使用する場合, コマンドは以下のように filename.md を filename.pdf にします。

pandoc filename.md -o filename.pdf --latex-engine=lualatex -t beamer -V theme:Madrid -V colortheme:seahorse -V fontsize:12pt -H h-luatexja.tex

themeやcolorthemeをいろいろいじることはできますが, いろいろ試した結果デフォルトの中では一番これがいい感じな気がしました。

以前作ったmd2pdfも今回のスライドも, markdownからpdfという方針は変わっていないので, 同じ実行ファイルでコマンドライン引数でスライドにするか通常のA4のpdfにするかに変更できるように改造しました。


gistff3558b7210ac6c722420f76a6954ff4

これでささっと研究進捗報告ができたらいいですね

Codeforces Div.2 682C Alyona and the Tree

問題要約

ある頂点{v}から部分木の頂点{u}までの距離を{dist(v,u)}とする.
すべての{v}, {u}に対して, {dist(v,u) < a[u]}満たさないようにするために、(木の)葉を取っていく.
取った数を調べる

続きを読む