求条玄关
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/10 20:28
  • 上次更新2024/5/10 22:05:46
查看原帖
求条玄关
745358
ChenZQ楼主2024/5/10 20:28

https://www.luogu.com.cn/problem/SP10606

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ll;
ll n,m;
int dp[22][1<<10][1<<10];
int a[22];
int check(int sta,int f)
{
	for(int i=0;i<=9;i++)
	{
		if(f&(1<<i) && ((sta&(1<<i))&(i%2))) return 0;
	}
	return 1;
}
int dfs(int len,int mask,int lim,int f,int pre)
{
	if(len==0)
	{
		return check(mask,f);
	}
	if(dp[len][mask][f]!=-1) return dp[len][mask][f];
	int ret=0;
	for(int i=0;i<=(lim?a[len]:9);i++)
	{
		if(!i && pre) ret+=dfs(len-1,mask,lim,f,pre);
		else
		{
			ret+=dfs(len-1,mask^(1<<i),lim&(i==a[len]),f|(1<<i),0);
		}
	}
	if(!pre && !lim)dp[len][mask][f]=ret;
	return ret;
}
int solve(int n)
{
	int tot=0;
	while(n>0)
	{
		a[++tot]=n%10;
		n/=10;
	}
	return dfs(tot,0,1,0,1);
}
int main()
{
	cin>>n>>m;
	memset(dp,-1,sizeof dp);
	int a=solve(m);

	memset(dp,-1,sizeof dp);
	cout<<a-solve(n-1);
} 
2024/5/10 20:28
加载中...