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
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
#define x first
#define y second
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;
}
#define int long long
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.
**/