Wannafly挑战赛18 B - 随机数

时间:2023-03-10 03:20:37
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 + ;
const int M = 1e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +; LL fastPow(LL a, LL b) {
LL ans = ;
while(b) {
if(b & ) ans = ans * a % mod;
a = a * a % mod; b >>= ;
}
return ans;
} LL a, n;
char s[N];
int main(){
scanf("%lld%s", &a, s);
int len = strlen(s);
for(int i = ; i < len; i++) {
n = n * % (mod - );
n += s[i] - '';
if(n >= mod - ) n -= mod - ;
} a = a * fastPow(10000ll, mod - ) % mod;
a = - * a;
a = ((a % mod) + mod) % mod; a = fastPow(a, n); a = - a;
if(a < ) a += mod;
a = a * fastPow(, mod - ) % mod;
printf("%lld\n", a);
return ;
}
/*
*/