题目

题目描述
给定整数 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;
}