0w1

CFR 474 D. Flowers ( DP )

Problem - D - Codeforces
題意:
有兩種食物,白色和紅色,吃的時候是吃一種排列,滿足白色的必須是連續 K 個。多筆詢問 [ l, r ],輸出吃 [ l, r ] 各長度方案數其和。
解法:
dp[ i ] : 吃 i 個的方案數
dp[ i ] = dp[ i - 1 ] + dp[ i - K ]

const int MAXB = ( int ) 1e5 + 1; // [ a < b ]

int T, K;

void init(){
	cin >> T >> K;
}

vi dp;
vi pdp;

void preprocess(){
	dp = vi( MAXB );
	dp[ 0 ] = 1;
	for( int i = 0; i + 1 < MAXB; ++i ){
		( dp[ i + 1 ] += dp[ i ] ) %= MOD7;
		if( i + K < MAXB )
			( dp[ i + K ] += dp[ i ] ) %= MOD7;
	}
	pdp = vi( MAXB );
	for( int i = 1; i < MAXB; ++i )
		( pdp[ i ] = pdp[ i - 1 ] + dp[ i ] ) %= MOD7;
}

void solve(){
	for( int i = 0; i < T; ++i ){
		int A, B; cin >> A >> B;
		int ans = pdp[ B ] - pdp[ A - 1 ];
		ans %= MOD7, ans += MOD7, ans %= MOD7;
		cout << ans << endl;
	}
}