kmjp's blog

競技プログラミング参加記です

Codeforces #355 Div2 C. Vanya and Label

体調悪い時ほどコンテストの出来がいい気がする…。
http://codeforces.com/contest/677/problem/C

問題

ある64進数の数が与えられる。
同じ桁数の2つの数の対のうち、bitwise-andを取ると入力値と等しくなるものは何通りあるか。

解法

2つの数として0~63(すなわち64進数1桁分)をそれぞれを取ったとき、andの値がどうなるかは総当たりで求められる。
ここから、各桁が0~63それぞれとなる組み合わせ数がわかる。

後は各桁についてその値を掛けるだけ。

int num[64];
string S;
ll mo=1000000007;
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>S;
	FOR(x,64) FOR(y,64) num[x&y]++;
	ll ret=1;
	FORR(r,S) {
		if(r>='0' && r<='9') r=r-'0';
		else if(r>='A' && r<='Z') r=10+r-'A';
		else if(r>='a' && r<='z') r=36+r-'a';
		else if(r=='-') r=62;
		else if(r=='_') r=63;
		ret = ret * num[r] % mo;
	}
	cout<<ret<<endl;
	
}

まとめ

Div2とはいえCにしては簡単。