[ABC322G] Two Kinds of Base 题解
前言
没人写题解,研究了好久,来总结一下。正巧还没做过这种套路。
正文
0x00 题目分析
转化一下题目变成,给定了
其中
发现这玩意很像是一个特殊进制的数,不妨把
-
随着
S 的长度增长,F 函数增长是指数级别的,即当S 的长度为k 时,F\left(a,b,S\right) 函数是\mathcal{O}\left(a^k\right) 的。 -
对于任意满足题目条件的
S ,若x\gt0 ,有F\left(a,b,S\right)\lt x\times\left(a^{k}-b^{k}\right) 。就像是进制填数一样,高位填的数一定是决定性的,后面永远追不上,证明显然拆开\left(a^{i}-b^{i}\right) 这一坨即可。
0x01 开始解题
根据第一条性质可得,对于任意会成为答案的
不妨考虑暴力枚举
这里枚举一下满足这些条件的
0x02 完了吗?
注意对于
其他情况,同样由于
最终时间复杂度
0x03 代码实现
注意所谓乱填
AC CODE
#include<bits/stdc++.h>
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE int
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char s[20];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){s[i++]=x%10;x/=10;}while(i){putchar(s[--i]+'0');}return;}
long long pw[200010][23];
int main(){
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
register int i,k;
register long long a,b,S;
const long long mod=998244353;
register long long res=0,tmp,now;
long long n=read();
long long x=read();
//k=2
for(S=1;S<=std::min(x,9ll);++S)
if(!(x%S)){
for(a=S+1+(x/S);a<=n;++a){//b<10
b=a-x/S;
if(b>=10) break;
(res+=b)%=mod;
}
if(n-(x/S)>=10) (res+=10*(n-((x/S)+10)+1))%=mod;//b>=10 a in [x/S+10,n] , b in [10,...]
}
//otherwise
for(a=1;a<=x;++a) pw[a][2]=a;
for(k=3;k<=22;++k){
for(a=1;a<=std::min(x-1,n);++a){
tmp=1;
for(i=1;i<k&&tmp<=(1e13);++i) tmp*=a;
if(tmp>(1e13)) break;
pw[a][k]=tmp;//pw[a][k] = a^(k-1) , f = pw[a][k]*S1+pw[a][k-1]*S2 ...
for(b=a-1;b;--b){
//check
if(pw[a][k]-pw[b][k]>x) break;
now=x;
for(i=k;i>1;--i)//S{k-i+1} = now mod pw[a][i]-pw[b][i]
if(now/(pw[a][i]-pw[b][i])>=std::min(10ll,b)) goto loop;
else now%=pw[a][i]-pw[b][i];
if(now) goto loop;
(res+=std::min(10ll,b))%=mod;
loop:;
}
}
}
print(res);
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
总结
抓住题目中这个东西“进制”这样的性质解题,熟悉套路。
p.s. 本文可能有笔误,看不懂得可以问我。