求助BSGS
查看原帖
求助BSGS
305891
Eraine楼主2023/1/4 17:31

rt,代码比较清奇,BSGS按照 ak+mra^{k+m-r} 的方式处理,开了__int128,但是WA80

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define __int128 long long
using namespace std;
map<__int128,int>mp;
__int128 bsgs(__int128 y,__int128 z,__int128 p){
	__int128 m=(__int128)ceil(sqrt(double(p))),mult=1;
	for(int r=1;r<=m;r++){
		mult=mult*y%p;
		z=z*y%p;
		mp[z]=r;
	}
	y=mult;
	for(int k=1;k<=m;k++){
		if(mp[mult])
			return k*m-mp[mult];
		mult=mult*y%p;
	}
	return -1;
}
__int128 read(){
	__int128 x=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+c-'0';
		c=getchar();
	}
	return x;
}
void write(__int128 x){
	if(!x)
		return;
	write(x/10);
	putchar(x%10+'0');
}
int main(){
	__int128 k=read(),m=read();
	write(bsgs(10,9*k+1,m));
	printf("\n");
	return 0;
}
2023/1/4 17:31
加载中...