列表

详情


NC15550. 箱庭的股市

描述

  有一天qwb收到来自箱庭的邀请函,准备打倒魔王的qwb来到箱庭后却迷上了炒股。箱庭的股市为了不让股民亏钱便设立了一个有趣的机制:设A[i][j]为qwb所持有的股票第i天第j秒的价格,

    需要注意的是作为异世界的箱庭时间有些奇怪,在箱庭里一天有m秒。由于qwb急需用钱,因此qwb要把股票卖了,他想知道卖股票时自己所持股票的价格,你能帮他算出来吗?

输入描述

每组的输出占一行,输出qwb所持股票在第x天的第y秒时的价格。
输入有多组(组数不超过20000)。
每组占一行,输入4个整数m,x,y,p(0<m<=1e4,0<=x <=1e6,0<=y<m,0<p<=1e6),分别表示箱庭的一天有m秒,qwb要在第x天的第y秒卖掉股票,qwb所持股票在第1天的第0秒的价格为p。

输出描述

每组的输出占一行,输出qwb所持股票在第x天的第y秒时的价格,结果对1e9 + 7取模。

示例1

输入:

3 2 2 1

输出:

2

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 524ms, 内存消耗: 24100K, 提交时间: 2023-06-20 10:11:02

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e6 + 5;
ll inv[maxn], invfac[maxn], fac[maxn];
const ll mod = 1e9 + 7;
void pre() {
	inv[0] = invfac[0] = 1;
	inv[1] = invfac[1] = 1;
	fac[1] = 1;
	for (ll i = 2; i <= 1e6; i++) {
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		invfac[i] = invfac[i - 1] * inv[i] % mod;
		fac[i] = fac[i - 1] * i % mod;//递推逆元以及阶乘逆元, (虽然不常用)
	}
}
ll C(ll n, ll m) {
	return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
}
signed main() {
	pre();
	ll m, x, y, p;
	while (std::cin >> m >> x >> y >> p) {
		if (x == 1 or y == 0) {
			cout << p << endl;
			continue;
		}
		ll ans = 0;
		for (ll i = 0; i <= y; i++) {
			ans = (ans + C(x - 1, i)) % mod;
		}
		ans = ans * p % mod;
		cout << ans << endl;
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 776ms, 内存消耗: 560K, 提交时间: 2020-05-11 19:48:45

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=10005;
const int mod=1e9+7;
int inv[maxn];
void initial(const int n=1e4)
{
	inv[0]=inv[1]=1;
	for(int i=2;i<=n;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
	for(int i=2;i<=n;i++) inv[i]=1ll*inv[i]*inv[i-1]%mod;
}
int _pow(int a,int n)
{
	int res=1; a%=mod;
	while(n)
	{
		if(n&1) res=1ll*res*a%mod;
		a=1ll*a*a%mod;
		n>>=1;
	}
	return res;
}
int main(void)
{
	initial();
	int m,x,y,p;
	while(scanf("%d%d%d%d",&m,&x,&y,&p)!=EOF)
	{
		int res;
		if(y>=x) 
		{
			res=_pow(2,x-1);
		}
		else
		{
			x--;
			int fz=1;  res=0;
			for(int i=x,j=0;j<=y;i--,j++)
			{
				res=(res+1ll*fz*inv[j]%mod)%mod;
				fz=1ll*fz*i%mod;
			}
		}
		printf("%d\n",1ll*res*p%mod);
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 805ms, 内存消耗: 12304K, 提交时间: 2019-07-19 20:05:01

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int m,x,y,p,L;
int inv[1000005],ans;
int ifac[1000005],fac[1000005];

int main(){
	inv[1]=1;
	for(int i=2;i<=1000000;i++) inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
	ifac[0]=fac[0]=1;
	for(int i=1;i<=1000000;i++){
		ifac[i]=1LL*ifac[i-1]*inv[i]%mod;
		fac[i]=1LL*fac[i-1]*i%mod;
	}
	while(scanf("%d %d %d %d",&m,&x,&y,&p)!=EOF){
		ans=0;
		L=min(x-1,y);
		for(int i=0;i<=L;i++) (ans+=1LL*fac[x-1]*(1LL*ifac[i]*ifac[(x-1)-i]%mod)%mod)%=mod;
		printf("%d\n",1LL*ans*p%mod);
	}
	
	return 0;
}

上一题