10/25

早起きしたかったんだけどできなくてひとまず残念からはじまった今日
すべての講義で寝ていたのでなんか疲れてるのかもしれない フルで寝ていたわけではない
例会に行ってご飯食べて、「匂い」についての話を少し
絶対みんな意識してると思ったけど気づいてなくて以外だった でも、実際に意識させて体験するとみんなわかってくれたのでよかった たぶん
ダークソウルというゲームを少しやった グラフィックがすごかったがすごすぎて描画が間に合ってなくて残念な感じになっていた あと、なんかMicrosoftのアカウントを作るのに四苦八苦していてしかも作れなかった そういうのほんとよくない
宇宙船を組み立てて荷物を運ぶボードゲームを遊んだ やはりボドゲの本質はそのゲームの中身云々ではなく、そこで生まれる笑い、会話だと思う 
最後に一応Atcorder#009のC問題(http://arc009.contest.atcoder.jp/tasks/arc009_3)がとけたのでコードを乗せておく
smallcaseとサンプルのlergecaseではうまくいくのに、実際提出するとlergecaseが一個も通ってなくてけ結構だるかった 結局どこがだめだったのか(計算方法があっていることは保証済みだったのでmodとるタイミングの問題っぽかった)わからなかったが、とりあえず処理のタイミングを分割して丁寧にしたらうまくいった
今度詳しい人に聞いてみるのもいいかもしれない

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cassert>
#include <fstream>
#include<math.h>
 
#define FOR(i,k,n)      for (int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c)      for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define sz       size()
#define lgt      length()
#define pb       push_back
#define mp       make_pair
#define ALL(X)   (X).begin(),(X).end()
#define SORT(a)  sort(ALL(a));

const long long mod = 1777777777;
 
using namespace std;
 
typedef pair<int,int> pint;
typedef vector<int> vi;
typedef vector<string>  vs;
typedef vector<vi>       vvi;
 
 long long  a[800000];
 
int toInt(string s){int v;istringstream sin(s);sin>>v;return v;}
double toDouble(string s){double v;istringstream sin(s);sin>>v;return v;}
template<class T>string toString(T x){ostringstream sout;sout<<x;return sout.str();}
vs form(string a,char s){a+=s;vs v;string b;REP(i,a.lgt){if(a[i]==s){v.pb(b);b="";}else b+=a[i];}return v;}
vi formint(string a,char s){a+=s;vi v;string b;REP(i,a.lgt){if(a[i]==s){v.pb(toInt(b));b="";}else b+=a[i];}return v;}
//累乗してmodとる関数 あらゆるタイミングでmodとってるからオーバーフローしないはず
//ちなみに蟻本からぱくった
long long mod_pow(long long x,long long n,long long modo){
	if(n==0)return 1;
	long long res = mod_pow((x%modo)*(x%modo)%modo,n/2,modo);
	if(n&1) res = (res%modo) * (x%modo) % modo;
	return res;
}

 
int main(){
	long long N;
	long long K;
	cin >> N >> K;
	
	a[1]=0;
	a[2]=1;
	for(long long i=3;i<K+1;i++){
		a[i]=(((((i-1)%mod)*(a[i-1])%mod))%mod+(((i-1)%mod)*(a[i-2]%mod))%mod)%mod;
	}//ここまでで完全順列は取れている
	long long  p=1;
	REP(j,K){
		//p=(p*(N-j)%mod*(mod_pow((K-j),mod-2,mod)%mod))%mod;//ここでnCkのmodを取ってるはずなんだけど・・・
		p *= (N-j)%mod;
		p %= mod;
		p *= mod_pow((K-j),mod-2,mod);
		p %= mod;//上のコメントの内部の行の処理を分割した
	}
	//cout << (p*a[K])%mod << endl;
	p *= a[K];
	p %= mod;//ここもいちいち分割
	cout << p <<endl;
	return 0;
}