题解:关注 small_lemon_qwq 谢谢喵
small_lemon_qwq · · 题解
考虑不打表。
另一种非打表但是需要点脑子的做法见这里。
令
注意到,从
这样运算量就大概是
这个题解启发我们可以用高精度动态求检查是否存在为 我的做法是开一个栈存储所有为 。前面这句话过时了,我的新做法可以看代码。
考虑计算运算量,
补一下时间复杂度,设
#include<bits/stdc++.h>
using namespace std;
#define if_1(x) if(__builtin_expect((x),1))
#define if_0(x) if(__builtin_expect((x),0))
int T,n,x,d=1,p[10]{1};
uint8_t cnt,c[10]{1},t;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=9;i++)p[i]=p[i-1]*10;
for(int i=1;i<=n;){
x+=d;
(i%7==0||c[t]==7)&&(d=~d+1);
if_0(t&&c[t]==7){
if_1(i+p[t]<=n){
i+=p[t],++c[t];
}else{
((n-i)&1)&&(x+=d);
break;
}
x-=(d=~d+1);
continue;
}
++i;
int j(0);
while(c[j]==9)c[j++]=0;
(++c[j])==7&&(t=j);
}
cout<<(x%1337+1336)%1337+1;
return 0;
}