20190918

918……

预审:

T1

枚举子集???3^N

T2

16MB……像数学题……A是开不下的……

总之T2是只能开个M的数组

T3

反复亦或的话……没想法

过程:

T1

先$mod$一下$n$

然后排个序?

有$0$直接出,要不两头扫

仿佛对

先考虑更靠近$0,N$的

用另一个去填。

仿佛出锅了……

目前仿佛是:

    在有序的数组里前缀和可以得出正确的ans

    目前来看,仿佛无解还真做不到……

    无论如何都有解?

    于是又无聊写了单调栈……

证明:

前缀和在mod n 意义下有n种情况

1. 有 0,直接输出

2. 无 0,则还剩n-1 种情况,由抽屉原理可知必有至少两个相等.

于是一定有一个合法区间。

    故此题一定有解。

    (于是也可以 O(N) 过了)

    马上改桶,单调栈爆了……

    又快又好QwQ

关于对拍:

写个××暴力,写spj就可以了啊=。=

附一个用 fstream 和 mt19937 写的,要开C++11编译……

#include <bits/stdc++.h>
#define N 100000
#define M 1111111
using namespace std;
int arr[M],nn,an;
bool che[M];
mt19937 rr(time(0));
bool check(){
	fstream dat;
	dat.open("1.in",ios_base::in);
	dat>>nn;
	for(int i=1;i<=nn;i++){
		dat>>arr[i];
	}
	dat.close();
	fstream ans;
	ans.open("1.out",ios_base::in);
	ans>>an;
	if(an==-1){
		cout<<"-1-1-1-1-1-1-1-1-1-1-"<<endl;
		exit(0);
	}
	int ansc=0,b;
	memset(che,0,sizeof che);
	for(int i=1;i<=an;i++){
		ans>>b;
		if(che[b]==1)return 0;
		ansc+=arr[b];
		che[b]=1;
		ansc%=nn;
	}
	return ansc==0;
}
void Ran(){
	fstream ran;
	ran.open("1.in",ios_base::out);
	int n=10000;
	ran<<n<<endl;
	for(int i=1;i<=n;i++)
		ran<<int(rr()%1000000000+1)<<" ";
	ran.close();
}
int main(){
	int T=N;
	while(T--){
		Ran();
		system("time ./T");
		if(!check()){
			puts("WA----------------QnQ");
			return 0;
		}
		cout<<T<<"/"<<N;puts("AcA QvQ");
	}
}
/*
g++ dp.cxx -o dp
g++ T1.cpp -o T
ls
./dp
*/

T2

$A[i]=X[i]*pow(Y[i],count[i])+Z[i]+Y[i]*Z[i]+...+pow(Y[i],count[i]-1)*Z[i] mod {2^{K-1}}$

后面就可以提一个$Z[i]$,然后用$(1-Y[i]^n)*1/1-Y[i] ext{     }or ext{     } nY[i]$求……

做到了$log$求$A$?

维护$count$前缀和?

一波乱搞,

发现前两个$subtask$可以开出来$A$

hiahiahia

然后一波容斥判断。

T3

只会暴力,10%

结果:

14
Miemeng 100
03:13:30
0
03:17:12
10
03:13:43
110
03:17:12
原文地址:https://www.cnblogs.com/kalginamiemeng/p/Exam20190918.html