您的位置:首页 > 其它

FJ省队集训DAY4 T3

2016-07-12 09:10 197 查看






#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long ll;
ll read(){
ll t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}

int n,K,lim,ans=0;
int a[20],tot=0,cnt[10],C[15][15];
ll pw_[30],*pw;

void dp(int id,bool f,bool f2) {
if (id==0) {
++ans;
return;
}
if (f2) {
for (int i=1;i<=(f?9:a[id]);i++)
if (cnt[i]>0) {
--cnt[i];
dp(id-1,f|(i<a[id]),0);
++cnt[i];
}
return;
}
if (f) {
int tmp=1;
for (int j=0;j<=9;j++)
tmp*=C[id][cnt[j]],
id-=cnt[j];
ans+=tmp;
return;
}
for (int i=0;i<=a[id];i++)
if (cnt[i]>0) {
--cnt[i];
dp(id-1,f|(i<a[id]),0);
++cnt[i];
}
}
void dfs(int num,int tot2,int used){
if (num==9){
cnt[9]=tot2-used;
int p=-1,g=0;
for (int i=0;i<=9&&p==-1;g+=cnt[i++]){
if (g<(tot2+1)/2&&g+cnt[i]>=(tot2+1)/2)
p=i;
}
ll val=0;
for (int i=0;i<=9;i++)
val+=cnt[i]*pw[i-p];
if (val<=lim) dp(tot2,tot2<tot,1);
return;
}
for (int i=0;i<=tot2-used;i++){
cnt[num]=i;
dfs(num+1,tot2,used+i);
}
}
void init(){
pw=pw_+12;
for (int i=-9;i<=9;i++){
pw[i]=1;
for (int j=1;j<=K;j++)
pw[i]*=i;
}
C[0][0]=1;
for (int i=1;i<=12;i++){
C[i][0]=1;
for (int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
}
int main(){
n=read();K=read();lim=read();init();
while (n){
a[++tot]=n%10;
n/=10;
}
for (int i=1;i<=tot;i++) dfs(0,i,0);
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: