社区讨论
暂时放弃了,这一题数位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 条回复,欢迎继续交流。
正在加载回复...