省选前模拟
2020-01-31:
T1:
数位dp,首先有每次选最大的减去最优。
T2:
广义后缀自动机,建图搜索一遍建sam跑本质不同子串。
T3:
容斥dp,首先s值有log个,然后可以障碍之间转移。
记录g[i][j]为至多,然后容斥转移。
注意加入两个新点方便统计答案。
T4:
网络流原题,把行列拆开,
跑最大流算出最多能删掉多少无用士兵。
2020-01-31:
T1:
只有我不会做啊,首先转化题面,对于重复走的边,
可以把它看做新的边,这样转化成欧拉回路。
欧拉回路是所有的点度数都为偶数,考虑如何构造。
先建一颗最小生成树,满足边权最小,dfs时遇到奇点,加一条到父亲的边即可。
T2:
暴力不太会写啊。
每一个任务可以看作一个平行四边形,
两个任务的平行四边形的并就是所有要完成的任务。
接下来就是给这些格子编号,并且满足一个格点的上方和左上方的标号要小。
然后用坐标变换转化成矩形,就是给定杨氏矩阵形状求个数。
现在还没写出来。
T3:
说说dp好啦,要倒着dp。
因为当前翻硬币后,下一个人可能会翻回来,所以倒着。
定义dp[i][0/1]为在i轮前第i个硬币的状态。
然后转移。注意开long long,没注意数据范围结果暴力一分没有。
状态让人捉急,规划不好。
写写时间表好好计划计划。
2020-01-30:
T1:
拓扑dp。
T2:
首先字符集很小,这能联想到去枚举那个所用字符。
然后可以利用哈希判断,这里的哈希就是维护桶的前缀和,
然后以1为参照做差进制起来。
一些细节,每次碰到一个没有标记的颜色,要清空哈希表。
T3:
正解是2-sat,不过可以随机化练练手。
首先有一个伪了的贪心,复杂度O(n^2),然后发现n比较小,
所以可以随即打乱n次。
这次做的不算很好,先看到T2挺可做的,然后扎进去了,结果最后几个算法都伪了。
然后一些低级错误,T3没看到多测,T2没写无解,丢掉30分。
明天一定要认真。
2020-01-18:
题目不算太友好,但发现改题要简单些(除T1)
T1:
背包40pts
skyh大神说一看暴力搜索减枝就很可做,
正解不太会,先咕了。
T2:
给了一颗trie树,然后lcs是lca的深度-1
然后广义后缀自动机就很应景,因为两个点的len就是lcp
然后不知道怎么不枚举点集,坑掉了。
正解为后缀自动机+线段树合并
离正解差一个dfs序了,考虑一个parent_tree上的子树所有点的dfs序是连续的。
然后考虑怎么得到这个子树所有点对lca上的最大深度。
发现这个lca一定出自trie树上dfs序相邻的两个点,也就可以用线段树维护。
合并取左区间的右端点和右区间的左端点的lca即可。
1 #include<cstdio>
2 #include<iostream>
3 #include<tr1/unordered_map>
4 #define MAXN 510000
5 using namespace std;
6 inline int read(){
7 int s=0,w=0;char ch=getchar();
8 while(ch<'0'||ch>'9')w|=(ch=='-'),ch=getchar();
9 while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
10 return w?-s:s;
11 }
12 #define kd (read())
13 struct rr{
14 int nt,to;
15 }bl[MAXN<<3];int hd[MAXN<<3],itot=0;
16 inline void addedge(int fr,int to){
17 bl[++itot]=(rr){hd[fr],to};hd[fr]=itot;
18 return ;
19 }
20 int ans=0;
21 int zf[MAXN];
22 int L[MAXN],dfnum=0;
23 int ys[MAXN];
24 int sd[MAXN],f[MAXN][31],LOG[MAXN];
25 int E[MAXN],etot=0,em[MAXN];
26 int n;
27 inline void init(){
28 for(int i=1;i<=etot;++i)f[i][0]=E[i];
29 for(int j=1;(1<<j)<=etot;++j)
30 for(int i=1;i+(1<<j)-1<=etot;++i)
31 f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);
32 return ;
33 }
34 inline int LCA(int x,int y){
35 if(em[x]>em[y])swap(x,y);
36 int idx=LOG[em[y]-em[x]+1];
37 return ys[min(f[em[x]][idx],f[em[y]-(1<<idx)+1][idx])];
38 }
39 namespace Segment{
40 int root[MAXN<<1],num=0;
41 int ls[(MAXN<<1)*50],rs[(MAXN<<1)*50];
42 int lef[(MAXN<<1)*50],rig[(MAXN<<1)*50];
43 int mxsd[(MAXN<<1)*50];
44 inline void up(int u){
45 lef[u]=MAXN+1,mxsd[u]=rig[u]=0;
46 if(ls[u])
47 mxsd[u]=max(mxsd[u],mxsd[ls[u]]),lef[u]=min(lef[u],lef[ls[u]]),rig[u]=max(rig[u],rig[ls[u]]);
48 if(rs[u])
49 mxsd[u]=max(mxsd[u],mxsd[rs[u]]),lef[u]=min(lef[u],lef[rs[u]]),rig[u]=max(rig[u],rig[rs[u]]);
50 if(rig[ls[u]]!=0&&lef[rs[u]]!=MAXN+1)
51 mxsd[u]=max(mxsd[u],sd[LCA(ys[rig[ls[u]]],ys[lef[rs[u]]])]-1);
52 return ;
53 }
54 void insert(int &u,int l,int r,int pos){
55 if(!u)u=++num;
56 if(l==r){
57 lef[u]=rig[u]=l;
58 mxsd[u]=0;
59 return ;
60 }
61 int mid=l+r>>1;
62 if(pos<=mid)insert(ls[u],l,mid,pos);
63 else insert(rs[u],mid+1,r,pos);
64 return up(u),void();
65 }
66 int mergeTREE(int x,int y){
67 if(!x||!y)return x+y;
68 ls[x]=mergeTREE(ls[x],ls[y]);
69 rs[x]=mergeTREE(rs[x],rs[y]);
70 up(x);
71 return x;
72 }
73 }
74 using namespace Segment;
75 namespace SAM{
76 int yys[MAXN<<1];
77 int len[MAXN<<1],fa[MAXN<<1];
78 tr1::unordered_map<int ,int >son[MAXN<<1];
79 int las=1,tcnt=1;
80 inline void extend(int c,int id){
81 int p=las,np=las=++tcnt;
82 len[np]=len[p]+1;
83 yys[np]=id;
84 for(;p&&!son[p][c];p=fa[p])son[p][c]=np;
85 if(!p)fa[np]=1;
86 else{
87 int q=son[p][c];
88 if(len[q]==len[p]+1)fa[np]=q;
89 else{
90 int nq=++tcnt;
91 fa[nq]=fa[q];
92 son[nq]=son[q];
93 len[nq]=len[p]+1;
94 fa[q]=fa[np]=nq;
95 for(;p&&son[p][c]==q;p=fa[p])son[p][c]=nq;
96 }
97 }
98 return ;
99 }
100 void Dfs(int u){
101 if(yys[u])insert(root[u],1,dfnum,L[yys[u]]);
102 bool ok=0;
103 for(int i=hd[u];i;i=bl[i].nt)
104 ok=1,Dfs(bl[i].to),root[u]=mergeTREE(root[u],root[bl[i].to]);
105 if(ok)ans=max(ans,len[u]+mxsd[root[u]]);
106 return ;
107 }
108 }
109 using namespace SAM;
110 void dfs(int u,int fat){
111 L[u]=++dfnum;ys[dfnum]=u;
112 if(u!=1)extend(zf[u],u);
113 sd[u]=sd[fat]+1;
114 int tmp=las;
115 E[++etot]=L[u];em[u]=etot;
116 for(int i=hd[u];i;i=bl[i].nt)
117 las=tmp,dfs(bl[i].to,u),E[++etot]=L[u];
118 return ;
119 }
120 int main(){
121 //freopen("da.in","r",stdin);
122 //freopen("2.out","w",stdout);
123 n=kd;
124 for(int i=2,x;i<=n;++i){
125 x=kd,zf[i]=kd+1;
126 addedge(x,i);
127 }
128 for(int i=2;i<=(n<<1);++i)LOG[i]=LOG[i>>1]+1;
129 dfs(1,0);
130 init();
131 itot=0;for(int i=1;i<=n;++i)hd[i]=0;
132 for(int i=1;i<=tcnt;++i)
133 if(fa[i])addedge(fa[i],i);
134 Dfs(1);
135 printf("%d\n",ans);
136 return 0;
137 }
138 /*
139 7
140 1 1
141 1 2
142 2 1
143 2 2
144 5 1
145 5 2
146
147 */
dfs版的广义可能会被卡成$O(n^2)$
当然现在打的板子也不太正确,正确的貌似要特判一些东西,现在暂时鸽掉了。
T3:
%%Dybala大神
这种平衡树的用法貌似很常见,记得原来某次的差分表。
考场暴力没写,主要是康到题比较迷。
一直在想怎么构造一种赋值方法来代替那个递归比较,不太可行。
考虑动态地维护序列的有序。
把每个元素写成pair,即合并的两个原集合编号。
可以二分插入的位置,
首先在插入x时已经有序,也就是说前面所有集合的大小关系已经有了。
那么每次直接splay查询rank那么就可以判断是否能将x插在mid后面。
最后插入好后再询问rank便可。
注意相同的元素用并查集特判一下。
1 #include<cstdio>
2 #include<iostream>
3 #define MAXN 51000
4 using namespace std;
5 #define mkp(x,y) make_pair(x,y)
6 #define fi first
7 #define se second
8 namespace Splay{
9 int par[MAXN],ch[MAXN][2],sz[MAXN],val[MAXN];
10 int num=0,root=0;
11 #define lc (ch[x][0])
12 #define rc (ch[x][1])
13 inline bool chk(int x){
14 return ch[par[x]][1]==x;
15 }
16 inline void up(int x){
17 sz[x]=sz[lc]+sz[rc]+1;
18 return ;
19 }
20 inline void rotate(int x){
21 int y=par[x],z=par[y],k=chk(x),w=ch[x][k^1];
22 if(z)ch[z][chk(y)]=x;
23 ch[x][k^1]=y,ch[y][k]=w;
24 if(w)par[w]=y;
25 par[y]=x,par[x]=z;
26 return up(y),up(x),void();
27 }
28 inline void splay(int x){
29 int y=0,z=0;
30 while(par[x]){
31 y=par[x],z=par[y];
32 if(z)rotate(chk(x)==chk(y)?y:x);
33 rotate(x);
34 }
35 root=x;
36 return ;
37 }
38 inline void makeroot(int k){
39 int x=root;
40 while(1){
41 if(sz[lc]>=k)
42 x=lc;
43 else if(sz[lc]+1<k)
44 k-=sz[lc]+1,x=rc;
45 else break;
46 }
47 splay(x);
48 return ;
49 }
50 inline int rk(int x){
51 splay(x);
52 return sz[lc]+1;
53 }
54 }
55 using namespace Splay;
56 int fat[MAXN];
57 inline int find(int x){
58 if(fat[x]==x||!fat[x])return x;
59 return fat[x]=find(fat[x]);
60 }
61 pair<int ,int >w[MAXN];
62 int ys[MAXN];
63 inline bool cmp(pair<int ,int >a,pair<int ,int >b){//a<=b
64 if(find(a.fi)==find(b.fi)){
65 if(find(a.se)==find(b.se))return true;
66 return rk(ys[a.se])<rk(ys[b.se]);
67 }else return rk(ys[a.fi])<rk(ys[b.fi]);
68 }
69 int n;
70 int main(){
71 //freopen("da.in","r",stdin);
72 //freopen("3.out","w",stdout);
73 scanf("%d",&n);
74 w[1]=mkp(1,1),ys[1]=val[1]=1,sz[1]=1;
75 w[n+2]=mkp(n+2,n+2),ys[n+2]=2,val[2]=n+2,sz[2]=2;
76 par[1]=2,ch[2][0]=1;
77 num=root=2;
78 for(int i=2,u,v;i<=n+1;++i){
79 scanf("%d%d",&u,&v);
80 ++u,++v;
81 w[i]=mkp(u,v);
82 int l=1,r=i;
83 int pos=0;
84 while(r-l>1){
85 int mid=l+r>>1;
86 makeroot(mid);
87 if(cmp(w[val[root]],w[i]))l=mid;
88 else r=mid;
89 }
90 makeroot(r);
91 if(cmp(w[val[root]],w[i]))pos=r;
92 else pos=l;
93 makeroot(pos);
94 ys[i]=++num;val[num]=i;
95 if(find(w[i].fi)==find(w[val[root]].fi)&&find(w[i].se)==find(w[val[root]].se))
96 fat[find(i)]=find(val[root]);
97 int x=ch[root][1],p=root;
98 while(x)p=x,x=lc;
99 x=num;par[x]=p;
100 lc=rc=0;sz[x]=1;
101 p==root?ch[p][1]=x:ch[p][0]=x;
102 printf("%d\n",rk(num));
103 }
104 return 0;
105 }
初始化要完全。
2020-01-17:
T1:
由原题换成思博题,反复斟酌了一下生物链的定义以防滑天下之大稽
T2:
果然还是读错了题,以为task3是链数据还在想怎么这么水。
暴力跳链动态修改$dp$有85pts,全场就我一个没打趴。
正解是DDP,还在学。
T3:
由于IOI赛制和spj,还是比较好van的,
然而概率期望一些基础的东西还是不掌握
目前已解决6个task,qj到70分。。。
Task1:等差数列
Task2:化下柿子,然后快速幂
Task3:
1 #include<bits/stdc++.h>
2 using namespace std;
3 int data[11]={0,1,10,100,1024,10000,20000,50000,100000,524288,1000000};
4 namespace run1{
5 void Main(int x){
6 long double ans=0;
7 ans=(x+1.0)*0.5;
8 printf("%.10Lf\n",ans);
9 return ;
10 }
11 }
12 namespace run2{
13 inline long double qpow(long double a,int b){
14 long double res=1.0L;
15 for(;b;b>>=1,a=a*a)
16 if(b&1)res=res*a;
17 return res;
18 }
19 void Main(int x){
20 long double ans=0;
21 long double lim=(1e6);
22 for(int i=1;i<=(int)(1e6);++i)
23 ans+=qpow(i/lim,x);
24 printf("%.10Lf\n",ans);
25 return ;
26 }
27 }
28 namespace run3{
29 void Main(int x){
30 long double ans=0;
31 for(int i=1;i<=x;++i)ans+=(double)x/(double)i;
32 printf("%.10Lf\n",ans);
33 return ;
34 }
35 }
36 namespace run4{
37 void Main(int x){
38 long double ans=0,base=1.0L/(long double)x;
39 for(int i=2;i<=x+1;++i){
40 ans+=(long double)i*base*(i-1);
41 base=base*(x-i+1.0L)/(x*1.0L);
42 }
43 printf("%.10Lf\n",ans);
44 return ;
45 }
46 }
47 namespace run5{
48 void Get_ans(int u,int l,int r,long long duo,long double &ans,int lim){
49 for(int i=l;i<=r;++i)ans+=(lim-i+1LL);
50 ans+=(l-1LL)*(lim-l+1LL);
51 ans-=duo;
52 if(l==r)return ;
53 int mid=l+r>>1;
54 Get_ans(u<<1,l,mid,l*(lim-r+1LL),ans,lim),
55 Get_ans(u<<1|1,mid+1,r,l*(lim-r+1LL),ans,lim);
56 return ;
57 }
58 void Main(int x){
59 long double ans=0;
60 Get_ans(1,1,x,0,ans,x);
61 ans=ans/(long double)x/(long double)(x+1.0L)*2.0;
62 printf("%.10Lf\n",ans);
63 return ;
64 }
65 }
66 namespace run6{
67 long double dp[1000001];
68 void Main(int n){
69 long double sm=0;
70 for(int i=1;i<=n;++i){
71 dp[i]=2.0L*sm;
72 dp[i]=dp[i]/(long double)i+i;
73 sm+=dp[i];
74 }
75 printf("%.10Lf\n",dp[n]);
76 return ;
77 }
78 }
79 namespace run7{
80
81 void Main(int n){
82
83 return ;
84 }
85 }
86 int main(){
87 for(int i=1;i<=10;++i)
88 run7::Main(data[i]);
89 return 0;
90 }
91 /*
92 function randint(a, b) {
93 return a + Math.floor(Math.random() * (b - a + 1))
94 }
95
96 function randper(n) {
97 var a, p
98 a = []
99 for (i = 1; i <= n; i = i + 1) {
100 p = randint(1, i)
101 a[i] = a[p]
102 a[p] = i
103 }
104 return a
105 }
106
107 data = [1, 10, 100, 1024, 10000, 20000, 50000, 100000, 524288, 1000000]
108
109 function run1(n) {
110 return randint(1, n)
111 }
112
113 function run2(n) {
114 var res, i, x
115 res = 1000000
116 for (i = 1; i <= n; i = i + 1) {
117 x = randint(1, 1000000)
118 if (x < res) {
119 res = x
120 }
121 }
122 return res
123 }
124
125 function run3(n) {
126 var cnt, used , book , x, i
127 cnt = 0
128 used = 0
129 book = []
130 for (i = 1; i <= n; i = i + 1) {
131 book[i] = false
132 }
133 while (true) {
134 cnt = cnt + 1
135 x = randint(1, n)
136 if (book[x] == false) {
137 book[x] = true
138 used = used + 1
139 if (used == n) {
140 return cnt
141 }
142 }
143 }
144 }
145
146 function run4(n) {
147 var cnt, book , x, i
148 cnt = 0
149 book = []
150 for (i = 1; i <= n; i = i + 1) {
151 book[i] = false
152 }
153 while (true) {
154 cnt = cnt + 1
155 x = randint(1, n)
156 if (book[x]) {
157 return cnt
158 }
159 book[x] = true
160 }
161 }
162
163 function run5(n) {
164 var qL, qR, res
165 while (true) {
166 qL = randint(1, n)
167 qR = randint(1, n)
168 if (qL <= qR) {
169 break
170 }
171 }
172 res = 0
173 function seg_query(pL, pR) {
174 var pM
175 pM = Math.floor((pL + pR) / 2)
176 res = res + 1
177 if (qL <= pL && pR <= qR) {
178 return
179 }
180 if (qL <= pM) {
181 seg_query(pL, pM)
182 }
183 if (pM < qR) {
184 seg_query(pM + 1, pR)
185 }
186 return
187 }
188
189 seg_query(1, n)
190 return res
191 }
192
193 function run6(n) {
194 var lc, rc, pri, a, root , i, res
195 root = 0
196 lc = []
197 rc = []
198 pri = randper(n)
199 a = randper(n)
200 function treap_insert(p, q) {
201 var z
202 if (p == 0) {
203 lc[q] = 0
204 rc[q] = 0
205 return q
206 }
207 if (a[q] < a[p]) {
208 lc[p] = treap_insert(lc[p], q)
209 if (pri[lc[p]] < pri[p]) {
210 z = lc[p]
211 lc[p] = rc[z]
212 rc[z] = p
213 p = z
214 }
215 } else {
216 rc[p] = treap_insert(rc[p], q)
217 if (pri[rc[p]] < pri[p]) {
218 z = rc[p]
219 rc[p] = lc[z]
220 lc[z] = p
221 p = z
222 }
223 }
224 return p
225 }
226 for (i = 1; i <= n; i = i + 1) {
227 root = treap_insert(root , i)
228 }
229 res = 0
230 function dfs(p, d) {
231 res = res + d
232 if (lc[p]) {
233 dfs(lc[p], d + 1)
234 }
235 if (rc[p]) {
236 dfs(rc[p], d + 1)
237 }
238 }
239 dfs(root , 1)
240 return res
241 }
242 function run7(n) {
243 var tab, s, m, l, i, j, res
244 m = 100003
245 l = 5
246 tab = []
247 for (i = 0; i < m; i = i + 1) {
248 tab[i] = []
249 }
250 function sequal(s1, s2) {
251 var i
252 if (s1.length != s2.length) {
253 return false
254 }
255 for (i = 0; i < s1.length; i = i + 1) {
256 if (s1[i] != s2[i]) {
257 return false
258 }
259 }
260 return true
261 }
262 res = 0
263 function insert(s) {
264 var i, h
265 h = 0
266 for (i = 0; i < l; i = i + 1) {
267 h = (h * 31 + s[i]) % 1000000007
268 }
269 h %= m
270 for (i = 0; i < tab[h].length; i = i + 1) {
271 res = res + 1
272 if (sequal(tab[h][i], s)) {
273 return
274 }
275 }
276 res = res + 1
277 tab[h][tab[h].length] = s
278 }
279 for (i = 0; i < n; i = i + 1) {
280 s = []
281 for (j = 0; j < l; j = j + 1) {
282 s[j] = randint(0, 25)
283 }
284 insert(s)
285 }
286 return res
287 }
288 function run8(n) {
289 var a, b, i, x, res
290 a = []
291 for (i = 1; i <= n; i = i + 1) {
292 a[i] = false
293 }
294 res = 0
295 while (true) {
296 b = []
297 for (i = 1; i <= n; i = i + 1) {
298 if (a[i] == false) {
299 b[b.length] = i
300 }
301 }
302 if (b.length == 0) {
303 break
304 }
305 res = res + 1
306 x = b[randint(0, b.length - 1)]
307 for (i = x; i <= n; i = i + x) {
308 a[i] = true
309 }
310 }
311 return res
312 }
313 function run9(n) {
314 var f, i, j, res
315 a = []
316 for (i = 1; i <= n; i = i + 1) {
317 a[i] = randint(1, 10)
318 }
319 res = 0
320 f = []
321 for (i = 1; i <= n; i = i + 1) {
322 f[i] = 1
323 for (j = 1; j < i; j = j + 1) {
324 if (a[j] < a[i] && f[j] + 1 > f[i]) {
325 f[i] = f[j] + 1
326 }
327 }
328 if (f[i] > res) {
329 res = f[i]
330 }
331 }
332 return res
333 }
334 function run10(n) {
335 var x, i, res
336 x = 0
337 res = 0
338 for (i = 1; i <= n; i = i + 1) {
339 if (randint(1, 100000) != 1) {
340 x = x + 1
341 } else {
342 x = 0
343 }
344 if (x > res) {
345 res = x
346 }
347 }
348 return res
349 }
350 */
2020-01-16:
T3:
task1:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MN=100000;
4 //int a[MN+5],b[MN+5],c[MN+5];
5 void build_1()
6 {
7 int n=1000000000,x=233;
8
9 //ofstream A("npio1.in");
10
11 //A << n << endl;
12
13 for(int i=1;i<=n;++i)
14 {
15 x=(37*x+666)%19260817;
16 //A << x%10000 << ' ';
17 }
18 //A << endl;
19 cout<<x<<endl;
20 for(int i=1;i<=n;++i)
21 {
22 x=(37*x+666)%19260817;
23 //A << x%10000 << ' ';
24 }
25 //A << endl;
26 }
27 const int mod=1e9+7;
28 int main()
29 {
30 //build_1();
31 int x=233,y=11703104;
32 int res=0;
33 for(int i=1;i<=1000000000;++i){
34 x=(37*x+666)%19260817;
35 y=(37*y+666)%19260817;
36 res=((233LL*res)^(x%10000+y%10000))%mod;
37 }
38 cout<<res<<endl;
39 }
task2:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MAXN=16777217;
4 const int mod=1e9+7;
5 const long double PI=acos(-1.0L);
6 struct Cp{
7 long double x,y;
8 Cp(long double _x=0,long double _y=0){x=_x,y=_y;return ; }
9 friend Cp operator +(Cp a,Cp b){return Cp(a.x+b.x,a.y+b.y); }
10 friend Cp operator -(Cp a,Cp b){return Cp(a.x-b.x,a.y-b.y); }
11 friend Cp operator *(Cp a,Cp b){return Cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }
12 }a[MAXN],b[MAXN],omg1[MAXN],omg2[MAXN];
13 int ys[MAXN];
14 inline void init(const int &lim){
15 for(int i=1;i<lim;i<<=1)
16 for(int k=0;k<i;++k)
17 omg1[i+k]=Cp(cos(PI*k/i),sin(PI*k/i));
18 return ;
19 }
20 inline void FFT(Cp *x,const int &lim,const int &type){
21 for(int i=0;i<lim;++i)if(ys[i]<i)swap(x[i],x[ys[i]]);
22 for(int i=1;i<lim;i<<=1){
23 const int delta=i<<1;
24 for(int j=0;j<lim;j+=delta){
25 for(int k=0;k<i;++k){
26 Cp t1=x[j+k],t2=omg1[i+k]*x[i+j+k];
27 x[j+k]=t1+t2,x[i+j+k]=t1-t2;
28 }
29 }
30 }
31 if(type==-1){
32 reverse(x+1,x+lim);
33 for(int i=0;i<lim;++i)
34 x[i].x=((long long)(x[i].x/lim+0.5))%998244353;
35 }
36 return ;
37 }
38 int main(){
39
40 int n=5000000,x=23333;
41
42 for(int i=1;i<=n;++i)
43 {
44 x=(233*x+37)&32767;
45 a[i].x=x;
46 }
47
48 for(int i=1;i<=n;++i)
49 {
50 x=(233*x+37)&32767;
51 b[i-1].x=x;
52 }
53
54 int lim=16777216,L=23;
55 for(int i=0;i<lim;++i)
56 ys[i]=(ys[i>>1]>>1)|((i&1)<<L);
57 init(lim);
58
59 FFT(b,lim,1);FFT(a,lim,1);
60 for(int i=0;i<lim;++i)a[i]=a[i]*b[i];
61 FFT(a,lim,-1);
62
63 int res=0;
64 for(int i=1;i<=n;++i)
65 res=((233LL*res)^((long long)a[i].x))%mod;
66 cout<<res<<endl;
67
68 /*int n;
69 cin>>n;
70 for(int i=1;i<=n;++i)scanf("%Lf",&a[i].x);
71 for(int i=1;i<=n;++i)scanf("%Lf",&b[i].x);
72 int lim=1,L=-1;
73 for(;lim<n*2+1;lim<<=1,++L);
74 for(int i=0;i<lim;++i)
75 ys[i]=(ys[i>>1]>>1)|((i&1)<<L);
76 init(lim);
77 FFT(a,lim,1);FFT(b,lim,1);
78 for(int i=0;i<lim;++i)a[i]=a[i]*b[i];
79 FFT(a,lim,-1);
80 for(int i=0;i<lim;++i)cout<<a[i].x<<" ";
81 cout<<endl;*/
82
83 return 0;
84 }
task3:
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int MN=100000;
5 const int MOD=998244353;
6 int a[302767],b[302767];
7 int f[302767],g[302767];
8 signed main()
9 {
10 //freopen("3.out","w",stdout);
11 int n=1000000000,x=23333,y=29989;
12
13
14 for(int i=1;i<=302766;++i)
15 {
16 x=(233*x+37)&32767;
17 y=(233*y+37)&32767;
18 a[i-1]=x,b[i-1]=y;
19 }
20
21 for(int i=0;i<=32768;++i)
22 for(int j=0;j<=32768;++j)
23 f[i]=(f[i]+(long long)a[i-j]*b[j]%MOD)%MOD;
24 for(int i=0;i<=32768;++i)
25 for(int j=0;j<32768;++j)
26 g[i]=(g[i]+(long long)a[j]*b[i-j+32768]%MOD)%MOD;
27 int res=0;
28 for(int i=0;i<32768;++i)
29 res=((233LL*res)^f[i])%1000000007;
30 for(int i=32768;i<n;++i){
31 int idx=i%32768;
32 f[idx]=(f[idx]+g[idx])%1000000007;
33 //cout<<f[idx]<<" "<<f[i]<<endl;
34 res=((233LL*res)^f[idx])%1000000007;
35 }
36 cout<<res<<endl;
37 }
task4:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MN=100000;
4 char ton[1000000000];
5 void build_4()
6 {
7 int n=1000000000;
8 unsigned int x=23333;
9
10 //ofstream A("npio4.in");
11
12 //A << n << endl;
13
14 for(int i=1;i<=n;++i)
15 {
16 x=x^(x<<13);
17 x=x^(x>>17);
18 x=x^(x<<5);
19 ++ton[x%1000000000];
20 //A << x%1000000000 << ' ';
21 }
22 //A << endl;
23 }
24 const int mod=1e9+7;
25 int main()
26 {
27 build_4();
28 int res=0;
29 for(int i=0;i<1000000000;++i)
30 while(ton[i]){
31 res=((233LL*res)^i)%mod;
32 --ton[i];
33 }
34 cout<<res<<endl;
35 }
task5:
1 #include<bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 const LL inv=534566745;
5 const LL mod=(1LL<<32);
6 int n=1000000000;
7 short sz[1000000001];
8 int ssz[270000001];
9 int main()
10 {
11 freopen("55.out","w",stdout);
12 /*int n,x,y;
13 scanf("%d",&n);
14 for(int i=1;i<n;++i)
15 {
16 scanf("%d%d",&x,&y);
17 v[x].push_back(y);
18 v[y].push_back(x);
19 }
20 dfs(1,0);
21 printf("%d\n",n);
22 for(int i=1;i<=n;++i)printf("%d ",size[i]);*/
23
24 //ofstream A("npio5.in");
25
26 //A << n << endl;
27 long long x=493989120;
28
29 for(int i=n;i>=1;--i)
30 {
31 int sszz=0;
32 if(i<=270000000)sszz=++ssz[i];
33 else sszz=(int)(++sz[i]);
34 if(i<=25000000)cout<<i<<" "<<ssz[i]<<endl;
35 if(i==1)break;
36 //cout<<i<<" "<<x<<endl;
37 int fat=x%(i-1)+1;
38 //cout<<fat<<endl;
39 if(fat<=270000000){
40 ssz[fat]+=sszz;
41 }else{
42 sz[fat]+=sszz;
43 }
44 x=(x-37+mod)%mod*inv%mod;
45 //A << x%i+1 << ' ' << i+1 << endl;
46 }
47 int res=0;
48 for(int i=1;i<=n;++i){
49 if(i<=270000000){
50 res=((233LL*res)^ssz[i])%1000000007;
51 }else{
52 res=((233LL*res)^((int)sz[i]))%1000000007;
53 //cout<<(int)sz[i]<<endl;
54 }
55 }
56 cout<<sz[1]<<" "<<res<<endl;
57 }
58 //427390545
task6:
1 #include<bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 const int mod=1e9+7;
5 const int n=1000000000;
6 int main()
7 {
8 unsigned int x=23333,y,w=233;
9
10 LL ans=0;
11 for(int i=1;i<n;++i)
12 {
13 x=233*x+37;
14 w=(23*w+37)&32767;
15 ans+=w;
16 }
17 x=233*x+37;
18 y=233*x+37;
19 w=(23*w+37)&32767;
20 ans+=w;
21 for(int i=32321;i<=32321;++i){
22 long long an=ans-i;
23 int res=0;
24 for(int i=0;i<4;++i)
25 {
26 res=((233LL*res)^(an%10000))%mod;
27 an/=10000;
28 }
29 cout<<i<<" "<<res<<endl;
30 }
31 }
task7:
1 #include<cstdio>
2 #include<queue>
3 using namespace std;
4 const int MN=100000;
5 priority_queue<int> Q;
6 int ans[MN+5];
7 int main()
8 {
9 int n,op,x;
10 scanf("%d",&n);
11 for(int i=1;i<=n;++i)
12 {
13 scanf("%d",&op);
14 if(op==1)
15 {
16 scanf("%d",&x);
17 Q.push(x);
18 }
19 if(op==2)Q.pop();
20 ans[i]=Q.top();
21 }
22 printf("%d\n",n);
23 const int MOD=1000000009;
24 for(int i=1;i<=n;++i)printf("%d ",(ans[i]%MOD+MOD)%MOD);
25 }
task8:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int mod=1e9+7;
4 char ton[1000000000];
5 int main()
6 {
7 int n=1000000000;
8 unsigned int x=23333;
9
10 int res=0;
11 x=233*x+37;
12 int pos=x%1000000000;
13 ++ton[pos];
14 int cnt=0;
15 res=((233LL*res)^pos)%mod;
16 //cout<<"i=1 "<<pos<<" "<<pos<<endl;
17 for(int i=2;i<=n;++i)
18 {
19 x=233*x+37;
20 int idx=x%1000000000;
21
22 ++ton[idx];
23 if(idx<pos)++cnt;
24 //cout<<idx<<endl;
25 //cout<<cnt+ton[pos]<<" "<<i+1<<" "<<((i+1)/2)<<endl;
26 while(cnt+ton[pos]<(i+1)/2)cnt+=ton[pos++];
27 //cout<<"qwq"<<endl;
28 while(cnt>(i+1)/2-1)cnt-=ton[--pos];
29
30 //cout<<"i="<<i<<" "<<idx<<" "<<pos<<endl;
31 res=((233LL*res)^pos)%mod;
32 }
33
34 cout<<res<<endl;
35 }
task9:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int mod=1e9+7;
4 bitset<1000000000>ton;
5 int main()
6 {
7 const int n=1000000000,MX=1000000000;
8 unsigned int x=23333;
9 int cnt=0;
10 int res=0;
11 cout<<"qwq"<<endl;
12 for(int i=1;i<=n;++i)
13 {
14 x=233*x+37;
15 if(!ton[x%MX])++cnt;
16 ton[x%MX]=1;
17 res=((233LL*res)^cnt)%mod;
18 }
19 cout<<res<<endl;
20 }
task10:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MN=100000;
4 vector< pair<int,int> > v[MN+5];
5 vector<int> ans;
6 stack<int> S;
7 int dfn[MN+5],low[MN+5],cnt;
8 void tarjan(int x,int from)
9 {
10 dfn[x]=low[x]=++cnt;
11 S.push(x);
12 for(int i=0;i<v[x].size();++i)if(v[x][i].second!=from)
13 {
14 int y=v[x][i].first;
15 if(!dfn[y])
16 {
17 tarjan(y,v[x][i].second);
18 low[x]=min(low[x],low[y]);
19 if(low[y]>=dfn[x])
20 {
21 int res=(x+y)%998244353;
22 while(S.top()!=y)
23 {
24 res=(res+S.top())%998244353;
25 S.pop();
26 }
27 S.pop();
28 ans.push_back(res);
29 }
30 }
31 else low[x]=min(low[x],dfn[y]);
32 }
33 }
34 int main()
35 {
36 /*int n,m,x,y;
37 scanf("%d%d",&n,&m);
38 for(int i=1;i<=m;++i)
39 {
40 scanf("%d%d",&x,&y);
41 v[x].push_back(make_pair(y,i));
42 v[y].push_back(make_pair(x,i));
43 }
44 for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i,0);
45 sort(ans.begin(),ans.end());
46 printf("%d\n",ans.size());
47 for(int i=0;i<ans.size();++i)printf("%d ",ans[i]);*/
48 long long an1=5000000LL*5000000LL%998244353,an2=5000001LL*5000000LL%998244353;
49 cout<<(((233LL*an1)^an2)%1000000007)<<endl;
50 }
2020-01-02:
凭实力抱0,就没什么好说的。
T1的式子推错,但没有拍。T2数组开小,可能最近时间逐渐膨胀,已经忘记了自己渣渣的本质了。
T1:
刚开始推了错误的柿子,将序列按题意分成三部分用隔板法。
然后其实第一部分隔板显然是错的,因为不像第二部分钦定每个已经选了$A_i$个就消除影响了。
第一部分先钦定所有都选了$A_i$,在考虑把减的分配,但不能保证减的<=$A_i$。
过了样例没多想,太大意了。
正解对第一部分奇加偶减容斥,还是套用先选够的思想,但这里是至少有多少个不合法,二进制枚举(所以$n1$<=8)。
因为模数,去学了波$exlucas$。
1 inline LL fac(int n,const int &pi,const int &pk){
2 if(!n)return 1LL;
3 LL res=1LL;
4 for(int i=2;i<=pk;++i)if(i%pi)res=res*i%pk;
5 res=qpow(res,n/pk,pk);
6 for(int i=2;i<=n%pk;++i)if(i%pi)res=res*i%pk;
7 return res*fac(n/pi,pi,pk)%pk;
8 }
9 inline LL CRT(int ai,int mi,const int &Mod){
10 return ai*(Mod/mi)%Mod*qpow(Mod/mi,phi(Mod)-1,Mod)%Mod;
11 }
12 inline LL C(int n,int m,int pi,int pk){
13 LL fz=fac(n,pi,pk),fm1=fac(m,pi,pk),fm2=fac(n-m,pi,pk);
14 int k=0;
15 for(int i=n;i;i/=pi)k+=i/pi;
16 for(int i=m;i;i/=pi)k-=i/pi;
17 for(int i=n-m;i;i/=pi)k-=i/pi;
18 return fz*qpow(fm1,phi(pk)-1,pk)%pk*qpow(fm2,phi(pk)-1,pk)%pk*qpow(pi,k,pk)%pk;
19 }
20 inline LL exlucas(int n,int m,const int &Mod){
21 if(n<m)return 0;
22 if(!m)return 1;
23 LL res=0,tmp=Mod;
24 for(int i=2;i<=sqrt(Mod);++i)
25 if(tmp%i==0){
26 int pk=1;
27 while(tmp%i==0)tmp/=i,pk*=i;
28 res=(res+CRT(C(n,m,i,pk),pk,Mod))%Mod;
29 }
30 if(tmp>1)res=(res+CRT(C(n,m,tmp,tmp),tmp,Mod))%Mod;
31 return res%Mod;
32 }
实现过程是把模数分解质因子,求出每个$C_{n}^{m} \equiv a (mod\ P^{k})$的$a$,然后$CRT$合并。
然后利用$\frac{\frac{n!}{P^{x}}}{\frac{m!}{P^{y}}*\frac{(n-m)!}{P^{z}}}*P^{x-y-z} \equiv a(mod\ P^{k})$的形式。
把所有阶乘的$P$提出来,使互质可求逆元,求阶乘提质因子是递归过程,根据化的式子搞循环节,具体网上证明比较清晰。
单次求$a$的时间复杂度为$log_P$,如果调用次数多,预处理记忆化一些数组即可。
T2:
$FWT$的题,$FFT$时并没有写过题,全忘了。
注意变化值求一个点值数组。
or,and都是对于每个分治区间最高位影响。xor不会证。dalao的博客
考虑点值具有结合率和交换率。
所以第$2^{i}$行的点值就是第$2^{i-1}$的点值相乘。
要的答案为$\sum_{i=0}^{p}{x^{i}}$,可以倍增搞定$p$。
$f[x][i]=\sum\limits_{j=0}^{2^i-1} x^{2^j}$
$f[x][i]=f[x][i-1]+f[x^{2^{2^{i-1}}}][i-1]$
因为$f[x][i]$定义左闭右开,所以$P++$
T3:
对于状态$b$,状态$a_i$都可以转移,$g_i$为$a_i$的全局概率。
期望逆推可以直接$\sum {a_i}$
正推是$\frac{\sum g_{i}*a_{i}}{\sum g_{i}}$
不会证。
因为一个区间$[l,r]$可以分成$[l,k],[k+1,r]$,其中$s[k]=='O'$,所以具有子结构。
然后计忆化搜索,颓的代码。。。
dp[i][0]=max(dp[i+1][0],dp[i+1][1])+S[i];
dp[i][1]=max(dp[i+1][0],dp[i+1][1]+S[i]);