【神仙构造题】战争

题目

https://gmoj.net/senior/#contest/show/3227/2

思路

对初始状态构建势能函数F(S):
在这里插入图片描述
假设我们选到a1,a2那么F期望变化量Δ为:
在这里插入图片描述
与a无关
那么答案就很显然了:
在这里插入图片描述

代码

#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int mod=1e9+7,N=1<<17;
ll power(ll x,ll t)
{
	ll b=1;
	while(t)
	{
		if(t&1) b=b*x%mod; x=x*x%mod; t>>=1;
	}
	return b;
}
int n,s,t,p,aii;
ll inv,ans,sum,_x0[N+77],_x1[N+77];
void init(ll x)
{
	aii=N;
	_x0[0]=1;
	for(int i=1; i<aii; i++) _x0[i]=_x0[i-1]*x%mod;
	x=power(x,aii);
	_x1[0]=1;
	for(int i=1; i<aii; i++) _x1[i]=_x1[i-1]*x%mod;
}
int main()
{
	freopen("warfare.in","r",stdin); freopen("warfare.out","w",stdout);
	int T;
	scanf("%d%d%d%d",&T,&n,&s,&t);
	p=(ll)s*power(t,mod-2)%mod;
	inv=power(p,mod-2);
	init(inv);
	if(T==0)
	{
		for(int i=1; i<=n; i++)
		{
			ll x;
			scanf("%llu",&x);
			ll t=x%(mod-1);
			sum+=t;
			(ans+=_x1[t/aii]*_x0[t%aii]-inv+mod)%=mod;
		}
	}
	else
	{
		int m;
		ll x,y,z,b1,b2;
		scanf("%d%llu%llu%llu%llu%llu",&m,&x,&y,&z,&b1,&b2);
		int j=1;
		while(m--)
		{
			int q;
			scanf("%d",&q);
			ll l,r; scanf("%llu%llu",&l,&r);
			for(; j<=q; j++)
			{
				ll t=(b1%(r-l+1)+l)%(mod-1);
				sum+=t;
				(ans+=_x1[t>>17]*_x0[t&(N)-1]-inv+mod)%=mod;
				t=x*b2+y*b1+z;
				b1=b2,b2=t;
			}
		}
	}
	ll mx=(power(inv,sum)-inv+mod)%mod;
	printf("%llu",(mx-ans+mod)*power((2*inv-2+mod)%mod,mod-2)%mod);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值