题意:定义f(n,d)为数码d在1到n中出现的次数,其中d=0..9

如果f(d,k)=k,则称k是d好数

给定x和d,求不大于x的最大的d好数

x<=1e18

思路:考虑f的增长率主要和位数有关

各种位数,上限,下限剪枝……

事实上所有d好数不会超过1e11

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
#define N 210000
#define M 4100000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
ll INF=1e18;
int dx[]={-,,,};
int dy[]={,,-,}; ll a[N],b[N],ans,n,k,mi[N];
int len; ll read()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll calc(ll n)
{
if(n<) return ;
int len=;
while(n)
{
b[++len]=n%;
n/=;
}
ll t=,re=;
per(i,len,)
{
rep(j,,b[i]-)
{
if(i>=) re+=mi[i-]*(i-);
if(j==k) re+=mi[i-];
re+=mi[i-]*t;
}
if(b[i]==k) t++;
}
return re+t;
} void dfs(int u,ll now,ll now_,int flag,int s)
{
if(u==)
{
if(calc(now)==now)
{
ans=now;
return;
}
}
if(s>=)
{
if(calc(now)-now<=&&calc(now_)-now_>=)
{
ll l=now,r=now_,last=now;
while(l<=r)
{
ll mid=(l+r)>>;
if(calc(mid)-mid<=){last=mid; l=mid+;}
else r=mid-;
}
if(calc(last)-last==) ans=max(ans,last);
}
return;
}
ll x=calc(now)-now,y=calc(now_)-calc(now),z=now-now_;
if(x<&&x+y<) return;
if(x>&&x+z>) return;
if(flag)
{
per(i,,)
{
dfs(u-,now+mi[u-]*i,now+mi[u-]*(i+)-,,s+(i==k));
if(ans!=-INF) return;
}
}
else
{
dfs(u-,now+mi[u-]*a[u],now_,,s+(a[u]==k));
if(ans!=-INF) return;
per(i,a[u]-,)
{
dfs(u-,now+mi[u-]*i,now+mi[u-]*(i+)-,,s+(i==k));
if(ans!=-INF) return;
}
} } int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout); int cas;
scanf("%d",&cas);
mi[]=;
rep(i,,) mi[i]=mi[i-]*;
while(cas--)
{
k=read(),n=read();
ll n_=n;
if(n==)
{
printf("0\n");
continue;
}
len=;
while(n)
{
a[++len]=n%;
n/=;
}
ans=-INF;
n=n_;
dfs(len,,n,,);
printf("%I64d\n",ans); } return ;
}

最新文章

  1. 项目vue2.0仿外卖APP(六)
  2. [转]安装SharePoint 2013时安装AppFabric失败(错误码:1603)
  3. json写入new_hello文件
  4. web工程spring+ibatis单元测试
  5. cocos基础教程(2)Window环境下搭建
  6. Spring+jpa+access
  7. QUdpSocket Class
  8. java初学者必看经典
  9. Screwturn搭建企业内部wiki
  10. Android-支付宝快捷支付
  11. POJ 1611 The Suspects(简单并查集)
  12. phpmyadmin导出数据中文乱码问题
  13. JQuery获取元素类名
  14. 【小错误】WPF代码报错:未将对象引用设置到对象的实例。
  15. Java 中的系统时间
  16. python学习记录-机器学习
  17. java-16习题
  18. H3C505
  19. 如何使用chrome自带的Javascript调试工具 【转】
  20. JDBC选择数据库实例

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_6_BufferedReader_字符缓冲输入流
  2. value_counts()函数
  3. shift()函数
  4. 只有一个form 的程序, onactivate 只触发一次。
  5. 16/7/8_PHP-对象的高级特性
  6. ES6新增特性
  7. 优化内存_内存泄漏——C
  8. MySQL-第十三篇使用ResultSetMetaData分析结果集
  9. &lt;每日一题&gt; Day3:CodeForces-1141B.MaximalContinuousRest(简单题)
  10. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)