省选前模拟

 

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
",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 */
View Code

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
",rk(num));
103     }
104     return 0;
105 }
View Code

初始化要完全。

 

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
",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
",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
",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
",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
",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
",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 */
View Code

 

 

 

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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);
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
View Code

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 }
View Code

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);
23     const int MOD=1000000009;
24     for(int i=1;i<=n;++i)printf("%d ",(ans[i]%MOD+MOD)%MOD);
25 }
View Code

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 }
View Code

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 }
View Code

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
",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 }
View Code

 

 

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]=sumlimits_{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]);
原文地址:https://www.cnblogs.com/2018hzoicyf/p/12144020.html