MnZn 数位 dp 样例过了但是 1e19 错的
查看原帖
MnZn 数位 dp 样例过了但是 1e19 错的
310818
蒟酱厂妹楼主2022/7/7 17:11
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#define siz(x) int((x).size())
#define cauto const auto
#define all(x) (x).begin(),(x).end()
using std::cin;using std::cout;
using loli=long long;
using uloli=unsigned long long;
using venti=__int128_t;
using pii=std::pair<int,int>;
std::basic_string<int>sta;
uloli f[20][3][3][3][3][3][3][3][3][3][3][2];
uloli dfs(int pos,int8_t d0,int8_t d1,int8_t d2,int8_t d3,int8_t d4,int8_t d5,int8_t d6,int8_t d7,int8_t d8,int8_t d9,bool zer,bool lim){
#define chk(x) (!d##x||x%2==d##x-1)
	if(!pos)return chk(0)&&chk(1)&&chk(2)&&chk(3)&&chk(4)&&chk(5)&&chk(6)&&chk(7)&&chk(8)&&chk(9);
#undef chk
#define now f[pos][d0][d1][d2][d3][d4][d5][d6][d7][d8][d9][zer]
	if(!lim&&~now)return now;
	uloli ans=0;
	for(int i=zer,num=lim?sta[i]:9;i<=num;i++)switch(i){
#define cnt(x,y) x==y?(d##x?3-d##x:1):d##y
#define choose(x) case x:ans+=dfs(pos-1,cnt(x,0),cnt(x,1),cnt(x,2),cnt(x,3),cnt(x,4),cnt(x,5),cnt(x,6),cnt(x,7),cnt(x,8),cnt(x,9),0,lim&&i==num);break
		choose(0);choose(1);choose(2);choose(3);choose(4);choose(5);choose(6);choose(7);choose(8);choose(9);
#undef cnt
#undef choose
	}
	if(!lim)now=ans;
	return ans;
#undef now
}
uloli solve(uloli x){
	if(!~x)return 0;
	sta=0;
	do sta+=int(x%10),x/=10;while(x);
	uloli ans=dfs(siz(sta)-1,0,0,0,0,0,0,0,0,0,0,1,1);
	for(int i=siz(sta)-2;i>=1;i--)ans+=dfs(i,0,0,0,0,0,0,0,0,0,0,1,0);
	return ans;
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	// std::ios::sync_with_stdio(false);cin.tie(nullptr);
	memset(f,-1,sizeof f);
	int T;cin>>T;for(uloli l,r;T--;)
		cin>>l>>r,cout<<solve(r)-solve(l-1)<<'\n';
	return 0;
}

rt QAQ

2022/7/7 17:11
加载中...