luoguU38228 签到题 (BSGS)
2024-09-03 12:14:38
签到一脸
$a_n=10a_{n-1}+1$求出通项$a_n=\frac{10^n-1}{9}$,然后可以化成$10^n=9K+1 (mod m)$,求一个最小的n
然后我们知道这个n一定是<=m的
然后我们设n=i*t-j,其中$t=ceil(\sqrt{m})$,0<=i,j<t,移项,变成$10^{i*t}=(9K+1)*10^j$
我们把每个可能的$(9K+1)*10^j$都存下来(用hash或map),然后再枚举i去找和$10^{i*t}$相等的最大的j就可以了
复杂度基本上是$O(\sqrt{M}logM)$的
要写快速模乘、要开longlong
#include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
using namespace std;
const int maxn=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} map<ll,ll> mp;
ll K,M,SM; inline ll modx(ll a,ll b){
ll re=;
while(b){
if(b&) re=(re+a)%M;
a=(a<<)%M,b>>=;
}return re;
} inline ll modp(ll a,ll p){
ll re=;
while(p){
if(p&) re=modx(re,a);
a=modx(a,a),p>>=;
}return re;
} int main(){
ll i,j,k;
K=rd();M=rd();SM=ceil(sqrt(1.0*M));
ll b=(*K+)%M,x=;
for(i=;i<SM;i++,x=modx(x,)) mp[modx(x,b)]=i;
ll y=x;
for(i=SM;;i+=SM,y=modx(y,x)){
if(mp[y]){
printf("%lld\n",i-mp[y]);break;
}
}
return ;
}
最新文章
- 03.LoT.UI 前后台通用框架分解系列之——多样的表格
- Sprint(第八天11.21)
- git 找回丢失的commit
- TrustedInstaller管理权限
- HDU Coprime
- C++Primer 第十四章
- android:scaleType属性
- meta property=og标签含义及作用
- UOJ #236. 【IOI2016】railroad
- 用webpack4从零开始构建react脚手架
- 解决android sdk 运行出现 could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:的问题
- 开源流媒体服务器SRS学习笔记(4) - Cluster集群方案
- python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)
- oracle <;>; 选不出为null的部分
- 处理全站请求编码,无论是GET还是POST,默认是UTF-8
- SpringBoot在Kotlin中的实现(二)
- spring boot整合activemq消息中间件
- JavaScript 之基础知识
- oracle数据库导入导出09192255
- SubSets,SubSets2, 求数组所有子集
热门文章
- shell脚本中的数据传递方式
- C#编程:从控制台读取数字的两种方式
- 【终结版】C#常用函数和方法集汇总
- Munge服务部署和测试
- 一文让你熟练掌握Linux的ncat(nc)命令
- CrackMe-005全破详解(图文+源码)--上篇
- Nginx负载均衡中后端节点服务器健康检查的操作梳理
- @Scheduled 定时
- jsp中获取不到servlet的cookie
- UserControl 的一个值得注意的问题 [属性"; * ";的代码生成失败.错误是:";程序集";*.Version=1.0.0.0,Culture=neutral,..........无标记为序列化";