牛牛小数点 (欧拉定理)

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}..110n10ni1={k}.{k}{k}{k}..221   i1=10n1{k}(1)i10gcd(i,10)==1,(1),10x=1(mod i),xϕ(i) 10n=1+ki121025gcd(i,10)=125{k}25max(mc(2),mc(5))log25252510
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.
**/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值