kmjp's blog

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

TopCoder SRM 729 Div1 Easy MagicNumberThree

Mediumを落としたが何とかHardを解いてレート増。
https://community.topcoder.com/stat?c=problem_statement&pm=14822

問題

整数が与えられる。
この整数を文字列とみなし、その部分文字列を取るとき、3の倍数となるのは何通りか。

解法

上の桁から順に、3の余り毎に組み合わせをDPで求めるだけ。
225ptとはいえDiv1では余りに安易な問題に思えるが…。

ll from[3];
ll to[3];
ll mo=1000000007;

class MagicNumberThree {
	public:
	int countSubsequences(string s) {
		ZERO(from);
		int i;
		from[0]=1;
		FORR(c,s) {
			FOR(i,3) to[i]=from[i];
			FOR(i,3) (to[(i+c-'0')%3]+=from[i])%=mo;
			swap(from,to);
		}
		return (from[0]+mo-1)%mo;
		
	}
}

まとめ

問題が不足してるのかな?