给定整数K和质数m,求最小的正整数N,使得 11111⋯1(N个1) mod m≡K(modm)
说人话:就是 111…1111 mod m =K
思路:我们可以给左右两边同乘上99再加上11,因为膜运算的性质,因此这样做这个同余方程还是成立的。
然后问题就瞬间转化为:
给定整数K和质数m,求最小的正整数N,使得10^N ≡K(modm) (BSGS模板题)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll p, a, b; ll qmul(ll a, ll b, ll mod) { ll ans = 0; while (b) { if (b & 1) { ans = (ans + a) % mod; } a = (a + a) % mod; b >>= 1; } return ans % mod; } int main() { cin >> b >> p; a = 10; b = b * 9 + 1; b %= p; ll n = sqrt(p) + 1; map<ll,ll> mp; ll ans = b%p; for (int i = 0; i <= n; i++) { mp[ans] = i; ans = qmul(ans, a, p); } ans = 1; for (int i = 1; i <= n; i++) ans = qmul(ans, a, p); ll ret = 1; for (int i = 1; i <= n; i++) { ret = qmul(ret, ans, p); if (mp[ret] != 0) { cout << (ll)i * n - mp[ret] << endl; return 0; } } return 0; }