社区讨论

暂时放弃了,这一题数位dp调不出来,又没有题解

P2518[HAOI2010] 计数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi7wmpag
此快照首次捕获于
2025/11/21 04:49
4 个月前
此快照最后确认于
2025/11/21 04:49
4 个月前
查看原帖
CPP
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
//WARNING
#define int long long
//#define char unsigned char
//WARNING
#define F(x,y,z) for(int x=y;x<=z;x++)
#define D(x,y,z) for(int x=y;x>=z;x--)
#define all(x) x.begin(),x.end()
#define ini(x,y) memset(x,y,sizeof(x))
#define cint const int &
#define cauto const auto &
#define END fclose(stdin);fclose(stdout);
const int INF=0x3f3f3f3f3f3f3f3f;
const int MAXN=50+10;//(static_cast<int>(1e3)+25);
inline int read()
{
    int c=getchar(),x=0,y=1;
    while(c>'9'||c<'0')
    {
        if(c=='-'){
            y=-1;
        }
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*y;
}
inline char getc(){
    int c=getchar();
    while(!((c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='#'||c=='.')){
        c=getchar();
    }
    return static_cast<char>(c);
}
bool num[MAXN];
int dp[MAXN][2<<10];
int tmplt=0;
//vector<int> ans;
inline int dfs(int pos,int chosen,int lead,int limit){
	//cout<<pos<<endl;
	if(pos==0){
		if(chosen==tmplt){
//			for(cauto i:ans){
//				cout<<i;
//			}
//			cout<<endl;
			return 1;
		}
		return 0;
	}
	if(!lead&&!limit&&dp[pos][chosen]!=-1){
		return dp[pos][chosen];
	}
	int maxinum=limit?num[pos]:9;
	int ret=0;
	F(i,0,maxinum){
		if(i==0){
//			ans.push_back(i);
			ret+=dfs(pos-1,chosen,lead&&(i==0),limit&&(i==maxinum));
//			ans.pop_back();
			//cout<<ret<<endl;
		}else{
			if((1<<i)&chosen){
				continue;
			}
			if((1<<i)&tmplt){
//				ans.push_back(i);
				ret+=dfs(pos-1,chosen|(1<<i),lead&&(i==0),limit&&(i==maxinum));
//				ans.pop_back();
				//cout<<ret<<endl;
			}
		}
//		cout<<ret<<endl;
	}
	if(!lead&&!limit){
		//cout<<ret<<endl;
		dp[pos][chosen]=ret;
	}
//	cout<<ret<<endl;
	return ret;
} 
inline int part(int x){
	int len=0;
	while(x>0){
		num[++len]=x%10;
		tmplt|=(1<<(x%10));
		// cout<<x<<endl;
		x/=10;
	}
	if(tmplt&1){
		tmplt-=1;
	}
	ini(dp,-1);
//	F(i,0,9){
//		if((1<<i)&tmplt){
//			cout<<i<<endl;
//		}
//	}
	return dfs(len,0,1,1);
}
signed  main(){
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
	int n=read(); 
	printf("%lld",part(n)); 
	END;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...