luogu P4884多少个1(BSGS)

简介: luogu P4884多少个1(BSGS)

给定整数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;
}
相关文章
|
7月前
|
数据安全/隐私保护
[CFI-CTF 2018]IntroToPE 题解
[CFI-CTF 2018]IntroToPE 题解
36 0
|
9月前
|
人工智能
蓝桥 包子凑数 (筛数)
蓝桥 包子凑数 (筛数)
蓝桥 和为T (状压)
蓝桥 和为T (状压)
|
12月前
luogu P1536 村村通
luogu P1536 村村通
53 0
|
12月前
luogu P1551 亲戚
luogu P1551 亲戚
91 0
|
11月前
蓝桥每日打卡
蓝桥每日打卡
|
12月前
luogu p1494 小Z的袜子
luogu p1494 小Z的袜子
59 0
|
12月前
luogu P1993 小K的农场(差分约束系统)
luogu P1993 小K的农场(差分约束系统)
44 0
|
12月前
luogu P1516 青蛙的约会
luogu P1516 青蛙的约会
58 0
luogu P2391 白雪皑皑 (并查集 思维)
luogu P2391 白雪皑皑 (并查集 思维)
36 0
luogu P2391 白雪皑皑 (并查集 思维)