社区讨论

救救孩子,脑子坏了,80pt求助

P4152 [WC2014] 时空穿梭参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2qj7rm
此快照首次捕获于
2023/10/23 18:08
2 年前
此快照最后确认于
2023/10/23 18:08
2 年前
查看原帖
为什么别人的O(Tnm)能过我的过不了啊,枯了。
CPP
#include<bits/stdc++.h>
#define N 100010
#define mod 10007
#define M 22
using namespace std;
int p[N],vis[N],tot,g[N][M],C[N][M];
void add(int& a1,int a2) {a1=a1+a2>=mod?a1+a2-mod:a1+a2;}
int pls(int a1,int a2) {return a1+a2>=mod?a1+a2-mod:a1+a2;}
void init() {
	for(int i=2; i<=N-10; i++) {
		if(!vis[i]) p[++tot]=i;
		for(int j=1; j<=tot; j++) {
			if(i*p[j]>N-10) break;
			vis[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	}
	for(int i=0; i<=N-10; i++) C[i][0]=1;
	for(int i=1; i<=N-10; i++)
		for(int j=1; j<=20; j++) C[i][j]=pls(C[i-1][j-1],C[i-1][j]);
	for(int c=2; c<=20; c++) {
		for(int i=1; i<=N-10; i++) g[i][c]=C[i-1][c-2];
		for(int i=1; i<=tot; i++)
			for(int j=(N-10)/p[i]; j; j--) g[j*p[i]][c]=pls(g[j*p[i]][c]-g[j][c],mod);
	}
} 
int read() {
	int res=0,f=1;char ch=getchar();
	while(!isdigit(ch)) f=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch)) res=(res<<3)+(res<<1)+ch-'0',ch=getchar();
	return f*res;
}
int T,n,m[M];
int main() {
	init();
	T=read();
	int c;
	while(T--) {
		n=read(),c=read();int mn=0x3f3f3f3f,ans=0;
		for(int i=1; i<=n; i++) m[i]=read(),mn=min(mn,m[i]);
		for(int d=1; d<=mn; d++) {
			long long res=1;
			for(int i=1; i<=n; i++) {
				int mm=m[i]/d;
				res=res*pls((1ll*m[i]*mm-(1ll*(1+mm)*mm/2)*d)%mod,mod);
				if(i%3==0) res%=mod; 
			} add(ans,res*g[d][c]%mod);
		}  printf("%d\n",ans);
	}
}

回复

1 条回复,欢迎继续交流。

正在加载回复...