体調悪い時ほどコンテストの出来がいい気がする…。
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にしては簡単。