列表

详情


NC16733. 随机数

描述

有一个随机数生成器,每次运行以a/10000的概率产生1,1-a/10000的概率产生0,两次运行之间相互独立。
求运行n次后,产生1的个数为奇数的概率。为避免误差,答案对109+7取模(设答案化为的最简分数为,则输出A· B-1 mod (109+7),其中B-1是B模109+7的乘法逆元)。

输入描述

第一行一个整数,表示a
第二行一个整数,表示n

输出描述

一个整数,表示答案

示例1

输入:

2500
3

输出:

937500007

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 53ms, 内存消耗: 3356K, 提交时间: 2018-06-24 17:47:53

#include<bits/stdc++.h>
using namespace std;
using LL = int64_t;
const LL mod =1e9+7;

LL q_pow(LL x,LL n) {
    LL ans=1;
    while(n) {
        if(n%2==1) ans=(ans*x)%mod;
        n/=2;
        x=(x*x)%mod;
    }
    return ans;
}

int main()
{
    string s;LL a;cin>>a>>s;
    LL x=a*q_pow(10000LL,mod-2)%mod,n=0;
    for(int i=0;i<s.length();i++)
        n=(n*10+s[i]-'0')%(mod-1);
    LL ans=((1-q_pow(1LL-2*x,n)%mod+mod)%mod*q_pow(2,mod-2))%mod;
    cout<<(ans+mod)%mod;
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 21ms, 内存消耗: 2296K, 提交时间: 2018-07-13 09:49:10

#include<cstdio>
const int P=1e9+7;
int ksm(int x,int k=P-2){
	int ans=1;
	for(;k;k>>=1,x=1LL*x*x%P) if(k&1) ans=1LL*ans*x%P;
	return ans;
}
char s[1000006];
int main(){
	int a;
	scanf("%d%s",&a,s);
	int p=1LL*a*ksm(10000)%P,x=0;
	for(int i=0;s[i];++i) x=1LL*x*10%(P-1)+s[i]-'0';
	x%=(P-1);
	int ans=1-ksm(1-p-p,x);
	ans=(ans%P+P)%P;
	ans=1LL*ans*ksm(2)%P;
	
	printf("%d\n",ans);
}

Python3(3.5.2) 解法, 执行用时: 703ms, 内存消耗: 5500K, 提交时间: 2018-06-23 12:55:39

import math
a = int(input())
w = input()
n = 0
MOD = int(1e9 + 7)
for i in w:
    n = (n * 10 + int(i)) % (MOD - 1)
Q = 10000
#t = math.gcd(n, Q)
#n //= t
#Q //= t
print((pow(Q, n, MOD) - pow(Q - a - a, n, MOD) + MOD) % MOD * pow(2 * pow(Q, n,MOD), MOD - 2, MOD) % MOD)

上一题