NC16733. 随机数
描述
输入描述
第一行一个整数,表示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)