Codeforces - 855E

題目鏈接:Salazar Slytherin’s Locket


比較水的數位dp。

因爲我們只關注每一位的奇偶性,所以顯然可以對奇偶性狀態壓縮,然後有b進制位,因爲詢問很多,所以我們不能每一次都全部清空,所以把b也當成一個狀態存一下即可。


AC代碼:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int b,dp[11][70][1<<11],a[70],l,r;
int dfs(int pos,int s,int zero,int lim){
	if(!pos)	return !s;
	if(!zero&&!lim&&dp[b][pos][s]!=-1)	return dp[b][pos][s];
	int up=lim?a[pos]:b-1,res=0;
	for(int i=0;i<=up;i++){
		if(zero&&!i)	res+=dfs(pos-1,0,1,lim&&i==up);
		else	res+=dfs(pos-1,s^(1LL<<i),0,lim&&i==up);
	}
	if(!zero&&!lim)	dp[b][pos][s]=res;
	return res;
}
inline int calc(int x){
	int pos=0;
	while(x)	a[++pos]=x%b,x/=b;
	return dfs(pos,0,1,1);
}
inline void solve(){
	scanf("%lld %lld %lld",&b,&l,&r);
	printf("%lld\n",calc(r)-calc(l-1));
}
signed main(){
	memset(dp,-1,sizeof dp);
	int T;	cin>>T;	while(T--) solve();	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章