社区讨论
萌新求助
P7116[NOIP2020] 微信步数参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo2urnr5
- 此快照首次捕获于
- 2023/10/23 20:07 2 年前
- 此快照最后确认于
- 2023/10/23 20:07 2 年前
CPP
#include<bits/stdc++.h>
#define N 1000010
#define K 55
#define mod 1000000007
#define int long long
using namespace std;
int read() {
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch)) res=res*10+ch-'0',ch=getchar();
return f*res;
}
int qpow(int a1,int a2) {
int res=1;
while(a2) {
if(a2&1) res=1ll*res*a1%mod;
a1=1ll*a1*a1%mod;
a2>>=1;
} return res;
}
int fac[K],inv[K];
int Lag(int n,int m) {
int res=0;
if(n<=m+2) {
for(int i=1; i<=n; i++) res=(res+qpow(i,m))%mod;
} else {
int t=1;
for(int i=1; i<=m+2; i++) t=t*(n-i)%mod;
int y=0,flag=(m+2)%2?1:-1;
for(int i=1; i<=m+2; i++) {
y=(y+qpow(i,m))%mod;
res=(res+((flag*y+mod)%mod)*t%mod*qpow(n-i,mod-2)%mod*inv[i-1]%mod*inv[m+2-i]%mod+mod)%mod;
flag=-flag;
}
} return (res+mod)%mod;
}
int n,k,mx[K],mn[K],len[K],c[N],d[N],v[K],w[K],u[K],ans;
int p[K];
signed main() {
freopen("P7116_14.in","r",stdin);
n=read(),k=read(),fac[0]=inv[0]=1;
for(int i=1; i<55; i++) fac[i]=fac[i-1]*i%mod;
inv[54]=qpow(fac[54],mod-2);
for(int i=53; i; i--) inv[i]=inv[i+1]*(i+1)%mod;
for(int i=1; i<=k; i++) mx[i]=w[i]=read(),mn[i]=1,len[i]=w[i];
for(int i=1; i<=n; i++) {
c[i]=read(),d[i]=read();
v[c[i]]+=d[i];
if(v[c[i]]>=0) mx[c[i]]=min(mx[c[i]],w[c[i]]-v[c[i]]);
else mn[c[i]]=max(mn[c[i]],-v[c[i]]+1);
}
int flag=1;
for(int i=1; i<=k; i++) if(v[i]||mn[i]>mx[i]) flag=0;
if(flag) {puts("-1");return 0;}
for(int i=1; i<=k; i++) mx[i]=w[i],mn[i]=1,len[i]=w[i];
for(int i=1; i<=n; i++) c[i+n]=c[i],d[i+n]=d[i];
for(int i=1; i<=2*n; i++) {
u[c[i]]+=d[i];
if(u[c[i]]>=0) mx[c[i]]=min(mx[c[i]],w[c[i]]-u[c[i]]);
else mn[c[i]]=max(mn[c[i]],-u[c[i]]+1);
int tlen=max(0ll,mx[c[i]]-mn[c[i]]+1);
if(tlen<len[c[i]]) {
int mul=i;
for(int j=1; j<=k; j++) if(j!=c[i]) {
if(len[j]<=0) {mul=0;break;}
mul=mul*len[j]%mod;
} ans=(ans+mul)%mod;
if(i>n) {
// puts("!");
int X=0x3f3f3f3f;
for(int j=1; j<=k; j++) {
if(len[j]<=0) {X=0;break;}
if(v[j]) X=min(X,(len[j]-1)/abs(v[j]));
}
memset(p,0,sizeof(p));
p[0]=i,p[1]=n;
for(int j=1; j<=k; j++) if(j!=c[i]) {
for(int t=k; t; t--) p[t]=(1ll*p[t-1]*((mod-abs(v[j]))%mod)%mod+mod+1ll*p[t]*len[j]%mod)%mod;
p[0]=1ll*p[0]*len[j];
}
for(int j=0; j<=k; j++) if(p[j]) ans=(ans+p[j]*Lag(X,j)%mod)%mod;
} len[c[i]]=tlen;
}
} printf("%lld",ans);
}
65pt,救救/kel
/bx/bx/bx/bx/bx
回复
共 0 条回复,欢迎继续交流。
正在加载回复...