Link
题意:
思路:
f ( i ) f(i) f(i)结论就是如果 i i i只含有2和5,那么就是0否则是 m a x ( m c ( 2 ) , m c ( 5 ) ) + 1 max(mc(2),mc(5))+1 max(mc(2),mc(5))+1, m c mc mc代表i的幂次,为什么呢,下面粗略的证明一下
假设当前循环节长度为n,然后是从第一位开始的形如
1 i = 0. { k } { k } { k } . . . , 那 么 我 们 假 设 1 i = 0. { k } { k } { k } . . 1 两 边 同 时 乘 以 1 0 n 也 就 是 1 0 n ∗ 1 i = { k } . { k } { k } { k } . . 2 2 − 1 得 1 i = { k } 1 0 n − 1 ( 1 ) 然 后 有 两 个 结 论 , 如 果 i 和 10 互 质 , 也 就 是 g c d ( i , 10 ) = = 1 , 那 么 一 定 能 表 示 成 ( 1 ) 柿 子 , 由 于 欧 拉 定 理 1 0 x = 1 ( m o d i ) , 同 时 x 等 于 ϕ ( i ) 时 候 成 立 那 么 1 0 n = 1 + k ∗ i 很 容 易 就 能 得 到 1 式 结 论 2 , 如 果 不 和 10 互 质 , 也 就 是 有 2 或 者 5 质 因 子 g c d ( i , 10 ) ≠ 1 可 以 发 现 每 剔 除 一 对 2 和 5 , { k } 就 会 往 前 移 动 一 位 那 么 我 们 需 要 剔 除 2 和 5 , 也 就 是 m a x ( m c ( 2 ) , m c ( 5 ) ) 现 在 考 虑 如 何 统 计 , 由 于 幂 次 是 l o g 级 别 的 , 我 们 暴 力 枚 举 2 和 5 的 幂 次 然 后 现 在 只 需 要 统 计 不 存 在 2 和 5 的 因 子 的 情 况 , 那 么 容 斥 一 下 就 可 以 了 减 去 2 和 5 再 加 上 10 \frac{1}{i}=0. \{ k \} \{k \} \{k \}...,那么我们假设\frac {1}{i}=0. \{ k \} \{k \} \{k \}..1\\ 两边同时乘以10^{n}也就是10^n*\frac {1}{i}=\{k\}.\{ k \} \{k \} \{k \}..2\\ 2-1得~~~\frac {1}{i}= \frac{\{k\}}{10^{n}-1}(1)\\ 然后有两个结论,如果i和10互质,也就是gcd(i,10)==1,\\ 那么一定能表示成(1)柿子,由于欧拉定理10^{x}=1(mod~i),\\同时x等于\phi(i)时候成立\\ 那么~10^{n}=1+k*i很容易就能得到1式\\ 结论2,如果不和10互质,也就是有2或者5质因子\\ gcd(i,10)\neq1\\ 可以发现每剔除一对2和5,\{k\}就会往前移动一位\\ 那么我们需要剔除2和5,也就是max(mc(2),mc(5))\\ 现在考虑如何统计,由于幂次是log级别的,我们暴力枚举2和5的幂次\\ 然后现在只需要统计不存在2和5的因子的情况,那么容斥一下就可以了\\ 减去 2和5再加上10 i1=0.{k}{k}{k}...,那么我们假设i1=0.{k}{k}{k}..1两边同时乘以10n也就是10n∗i1={k}.{k}{k}{k}..22−1得 i1=10n−1{k}(1)然后有两个结论,如果i和10互质,也就是gcd(i,10)==1,那么一定能表示成(1)柿子,由于欧拉定理10x=1(mod i),同时x等于ϕ(i)时候成立那么 10n=1+k∗i很容易就能得到1式结论2,如果不和10互质,也就是有2或者5质因子gcd(i,10)=1可以发现每剔除一对2和5,{k}就会往前移动一位那么我们需要剔除2和5,也就是max(mc(2),mc(5))现在考虑如何统计,由于幂次是log级别的,我们暴力枚举2和5的幂次然后现在只需要统计不存在2和5的因子的情况,那么容斥一下就可以了减去2和5再加上10
AC代码:
//#pragma GCC target("avx")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
// created by myq
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 400010;
const int mod=998244353;
inline int read()
{
int res=0;
int f=1;
char c=getchar();
while(c>'9' ||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
res=(res<<3)+(res<<1)+c-'0';
}
return res;
}
int solve(int x){
int now=1;
int res=0;
for(int i=0;i<=60;i++){
int nn=now;
int cost=i;
if(nn>x)
break;
for(int j=0;;j++){
cost=max(i,j)+1;
int cnt=x/nn;
res+=max(0ll,(cnt-cnt/2-cnt/5+cnt/10-1))%mod*cost%mod;
res%=mod;
nn*=5;
if(nn>x)
break;
}
now*=2;
}
// cout<<res<<endl;
return res;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int q;
cin>>q;
while(q--){
int l,r;
cin>>l>>r;
cout<<(solve(r)-solve(l-1)+mod)%mod<<endl;
}
return 0;
}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/