题目
题目描述
给定整数 KK 和质数 mm,求最小的正整数 NN,使得 11\cdots111⋯1(NN 个 11)\equiv K \pmod m≡K(modm)。
说人话:就是 111\ldots 1111 \bmod m =K111…1111modm=K。
输入格式
第一行两个整数,分别表示 KK 和 mm。
输出格式
一个整数,表示符合条件最小的 NN。
输入输出样例
输入 #1复制
9 17
输出 #1复制
3
说明/提示
30%30% 的数据保证 m\leq 10^6m≤10
6
。
60%60% 的数据保证 m\leq 5\times 10^7m≤5×10
7
。
100%100% 的数据保证 6\leq m\leq 10^{11}6≤m≤10
11
,0< K< m0<K<m。
思路
BSGS模板题
代码
#include<bits/stdc++.h>
using namespace std;
void print(int x){
if(x<10){
putchar(x+'0');
return ;
}else print(x/10);
putchar(x%10+'0');
}
map<int,int>vis;
int qpow(int x,int p,int P){
register int res=1;
for(;p;p>>=1,x=x*x%P)if(p&1)res=res*x%P;
return res%P;
}
int p,n,m,res,ans=1,Ans;
signed main(){
n=read()*9+1,p=read();n%=p;
m=ceil(sqrt((long long)p));
res=qpow(10,m,p)%p;
vis[n%p]=0;
for(register int i=1;i<=m;++i)
vis[qpow(10,i,p)*n%p]=i;
for(register int i=1;i<=m;++i){
ans=ans*res%p;
if(vis[ans]){
Ans=i*m%p-vis[ans];
print((Ans%p+p)%p);
return 0;
}
}
return 0;
}