Wannafly挑战赛18 B - 随机数

思路:化简公式,Pn 表示 进行n 次操作,有奇数次1的概率

Pn = (1 - x) * Pn - 1  + x * (1 - Pn - 1)

得通项公式 Pn = (1 - (1 - 2 * x) ^ n) / 2

n 很大 ,但是模数是素数,可以用费马小定理优化。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>

using namespace std;

const int N = 1e6 + 7;
const int M = 1e6 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +7;

LL fastPow(LL a, LL b) {
    LL ans = 1;
    while(b) {
        if(b & 1) ans = ans * a % mod;
        a = a * a % mod; b >>= 1;
    }
    return ans;
}

LL a, n;
char s[N];
int main(){
    scanf("%lld%s", &a, s);
    int len = strlen(s);
    for(int i = 0; i < len; i++) {
        n = n * 10 % (mod - 1);
        n += s[i] - '0';
        if(n >= mod - 1) n -= mod - 1;
    }

    a = a * fastPow(10000ll, mod - 2) % mod;
    a = 1 - 2 * a;
    a = ((a % mod) + mod) % mod;

    a = fastPow(a, n);
    
    a = 1 - a;
    if(a < 0) a += mod;
    a = a * fastPow(2, mod - 2) % mod;
    printf("%lld\n", a);
    return 0;
}
/*
*/

猜你喜欢

转载自www.cnblogs.com/CJLHY/p/9217146.html