SDOI2017 Round1 Day1 题解
不知道有几个AK的,除了出题人SB搬了个BZOJ3779以外,应该没什么因素阻碍AK吧。要是SCOI考这套题多好。
BZOJ4816 数字表格
SB反演,推出答案为$\prod_{i=1}^nf^{\sum_{j=1}^{\left\lfloor\frac ni\right\rfloor}\mu(j)\left\lfloor\frac n{ij}\right\rfloor\left\lfloor\frac m{ij}\right\rfloor}(i)$,直接$O(n^{3/4}+n^{1/2}\log n)$计算。
- #include<algorithm>
- #include<cstdio>
- using namespace std;
- typedef unsigned long long ll;
- const int p=1e9+7;
- const int N=1e6+5;
- ll wop(ll a,ll n){
- ll s=1;
- for(;n;n>>=1){
- if(n&1)s=s*a%p;
- a=a*a%p;
- }
- return s;
- }
- ll f[N],g[N];
- int r[N];
- bool vis[N];
- ll sol(int n,int m){
- ll s=0;
- int i=1;
- while(i<=n){
- int j=min(n/(n/i),m/(m/i));
- s+=(g[j]-g[i-1])*(n/i)*(m/i);
- i=j+1;
- }
- return s;
- }
- int main(){
- f[1]=1;
- for(int i=2;i<N;++i)
- f[i]=(f[i-1]+f[i-2])%p;
- f[0]=1;
- for(int i=1;i<N;++i)
- (f[i]*=f[i-1])%=p;
- g[1]=1;
- int l=0;
- for(int i=2;i<N;++i){
- if(!vis[i])
- g[r[l++]=i]=-1;
- for(int*j=r;;++j){
- if(i**j>=N)break;
- vis[i**j]=1;
- if(i%*j==0)break;
- g[i**j]=-g[i];
- }
- }
- for(int i=2;i<N;++i)
- g[i]+=g[i-1];
- int t,n,m;
- scanf("%d",&t);
- while(t--){
- scanf("%d%d",&n,&m);
- if(n>m)swap(n,m);
- ll s=1;
- int i=1;
- while(i<=n){
- int j=min(n/(n/i),m/(m/i));
- (s*=wop(f[j]*wop(f[i-1],p-2)%p,sol(n/i,m/i)))%=p;
- i=j+1;
- }
- printf("%lld\n",s);
- }
- }
BZOJ4817 树点涂色
做法同BZOJ3779。
- #include<algorithm>
- #include<cstdio>
- #define I (J+1)
- #define J (i+j>>1)
- #define P (k<<1)
- #define S (P^1)
- using std::max;
- const int N=1e5+5;
- int n,dfn;
- typedef int arr[N];
- arr c1,c2,c3,c4,c5,f1,f2,g;
- struct edge{
- int v;
- edge*s;
- }e2[N*2];
- edge*l=e2,*h[N];
- void ins(int u,int v){
- edge s={v,h[u]};
- *(h[u]=l++)=s;
- }
- void dfs(int u){
- c1[g[f1[u]=++dfn]=u]=1;
- for(edge*i=h[u];i;i=i->s)
- if(i->v!=c2[u]){
- c3[i->v]=c3[c2[i->v]=u]+1;
- dfs(i->v);
- c1[u]+=c1[i->v];
- if(c1[i->v]>c1[c4[u]])
- c4[u]=i->v;
- }
- f2[u]=dfn;
- }
- int lca(int s,int t){
- while(c5[s]!=c5[t])
- c3[c5[s]]>c3[c5[t]]?s=c2[c5[s]]:t=c2[c5[t]];
- return c3[s]<c3[t]?s:t;
- }
- namespace seg{
- struct node{int d,s;}a[N*4];
- void upd(int k){
- a[k].s=max(a[P].s,a[S].s)+a[k].d;
- }
- void inc(int d,int s,int t,int i,int j,int k){
- if(s<=i&&j<=t)
- a[k].d+=d,a[k].s+=d;
- else{
- if(s<I)inc(d,s,t,i,J,P);
- if(t>J)inc(d,s,t,I,j,S);
- upd(k);
- }
- }
- int ask(int s,int t,int i,int j,int k){
- if(s==i&&j==t)return a[k].s;
- int r=t<I?ask(s,t,i,J,P):s>J?ask(s,t,I,j,S):max(ask(s,J,i,J,P),ask(I,t,I,j,S));
- return r+a[k].d;
- }
- }
- void inc(int s,int d){
- seg::inc(d,f1[s],f2[s],1,n,1);
- }
- struct node;
- typedef node*ptr;
- struct node{ptr i,j,p;}e[N];
- bool root(ptr o){return o!=o->p->i&&o!=o->p->j;}
- void turn(ptr o){
- ptr s=o->p,t=s->p;
- if(!root(s))(s==t->i?t->i:t->j)=o;
- o->p=t,s->p=o;
- if(o==s->i)
- s->i=o->j,o->j->p=s,o->j=s;
- else
- s->j=o->i,o->i->p=s,o->i=s;
- }
- ptr splay(ptr o){
- while(!root(o)){
- if(!root(o->p))turn(o==o->p->i^o->p==o->p->p->i?o:o->p);
- turn(o);
- }
- return o;
- }
- void inc(ptr&o,int d){
- if(o!=e){
- while(o->i!=e)o=o->i;
- inc(splay(o)-e,d);
- }
- }
- ptr exp(ptr o){
- ptr s=e;
- for(;o!=e;o=o->p){
- inc(s,-1);
- ptr t=splay(o)->j;
- o->j=s,s=o;
- inc(t,1);
- }
- return s;
- }
- int ask1(int u){
- return seg::ask(f1[u],f2[u],1,n,1);
- }
- int ask2(int u){
- return seg::ask(f1[u],f1[u],1,n,1);
- }
- int main(){
- int m,o,u,v;
- scanf("%d%d",&n,&m);
- for(int i=2;i<=n;++i)
- scanf("%d%d",&u,&v),ins(u,v),ins(v,u);
- dfs(1);
- for(int i=1;i<=n;++i){
- e[i]=(node){e,e,e+c2[i]};
- if(c4[c2[i]]!=i)
- for(int j=i;j;j=c4[j])c5[j]=i;
- inc(i,1);
- }
- while(m--){
- scanf("%d%d",&o,&u);
- if(o==1)exp(e+u);
- else if(o==2){
- scanf("%d",&v);
- printf("%d\n",ask2(u)+ask2(v)-ask2(lca(u,v))*2+1);
- }else
- printf("%d\n",ask1(u));
- }
- }
BZOJ4818 序列计数
线性筛预处理贡献,矩阵快速幂优化DP。前者复杂度$O(m)$,后者复杂度$O(p^3\log n)$。注意到矩阵是循环矩阵,所以可以优化到$O(p^2\log n)$,用FFT可以进一步优化到$O(p\log p\log n)$。
代码是$O(m+p^2\log n)$的。
- #include<cstdio>
- #include<cstring>
- typedef unsigned long long ll;
- const int p=20170408;
- const int N=100;
- const int M=2e7+5;
- int n,m,l,q1[M/10],*q2=q1,c[N][2],e1[N],e2[N],f1[N],f2[N];
- bool v[M];
- inline void mul(int*a,int*b){
- static ll c[N];
- memset(c,0,sizeof c);
- for(int i=0;i<l;++i)
- for(int j=0;j<l;++j)
- c[(i+j)%l]+=(ll)a[i]*b[j];
- for(int i=0;i<l;++i)
- a[i]=c[i]%p;
- }
- int main(){
- scanf("%d%d%d",&n,&m,&l);
- for(int i=2;i<=m;++i){
- if(!v[i])*q2++=i;
- for(int*j=q1;;++j){
- if(i**j>m)break;
- v[i**j]=1;
- if(i%*j==0)break;
- }
- ++c[i%l][v[i]^1];
- }
- ++c[1%l][0];
- for(int i=0;i<l;++i){
- f1[i]=c[i][0]+c[i][1];
- f2[i]=c[i][0];
- }
- e1[0]=e2[0]=1;
- for(;n;n>>=1){
- if(n&1)
- mul(e1,f1),mul(e2,f2);
- if(n>1)
- mul(f1,f1),mul(f2,f2);
- }
- int s=(e1[0]-e2[0]+p)%p;
- printf("%d\n",s);
- }
SDOI2017 Round1 Day1 题解的更多相关文章
- SDOI2017 Round1 简要题解
我们 TM 怎么又要上文化课..我 哔哔哔哔哔哔 「SDOI2017」数字表格 题意 有 \(T\) 组数据,求 \[ \prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[ ...
- SDOI2017 Round1 Day2 题解
T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配. 费用流跑得过,可以不用KM. UPD:分数规划用迭代跑得飞快 ...
- SDOI2017 Round1
SDOI2017 Round1 在回去的车上写的 cnblog的markdown貌似有bug,空行都没有了 Day -several [清明节] 没想到在省选之前还会有一次放假 放假前一天晚上走到校门 ...
- THUSC2017 Day1题解
THUSC2017 Day1题解 巧克力 题目描述 "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有 ...
- SDOI2017 Round1 起点
第二次打酱油了 高一两次考试以打两瓶酱油告终 来的时候明知自己没戏,却总存有一丝希望 NOIP连200都没考到,是不是有点儿不自量力 如果我真的去争取那一丝希望的话,该有多好 先简单分析下考试 Day ...
- SDOI2017 Round2 详细题解
这套题实在是太神仙了..做了我好久...好多题都是去搜题解才会的 TAT. 剩的那道题先咕着,如果省选没有退役就来填吧. 「SDOI2017」龙与地下城 题意 丢 \(Y\) 次骰子,骰子有 \(X\ ...
- 【NOIP2014】Day1题解+代码
Day1 T1 签到题,模拟一下随便写就能过. 不过小心像我一样表打错傻逼的调了10min. #include <algorithm> #include <iostream> ...
- ZJOI2019 Day1 题解
想要继续向前,就从克服内心的恐惧开始. 麻将 题意 在麻将中,我们称点数连续的三张牌或三张点数一样的成为面子,称两张点数一样的牌为对子.一副十四张麻将牌的胡牌条件是可以分成四个面子和一个对子或者分成七 ...
- Codeforces Global Round1 简要题解
Codeforces Global Round 1 A 模拟即可 # include <bits/stdc++.h> using namespace std; typedef long l ...
随机推荐
- 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】
http://blog.csdn.net/xiajun07061225/article/details/7283929/ OpenGL Frame BufferObject(FBO) Overview ...
- [转载] C/C++中怎样获取日期和时间
C/C++中怎样获取日期和时间摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的 ...
- 数组全排列 knuth 分解质因数
template<typename T> void swap(T* a, T* b) { T temp = *a; *a = *b; *b = temp; } //数组的全排列 void ...
- discuz X3.1+Apache2.2+php-5.2.17+mysql5.6.14+Discuz_X3.1
discuz X3.1+Apache2.2.25+php-5.2.17+mysql5.6.14+Discuz_X3.1 一.准备 1.httpd-2.2.25-win32-x86-no_ssl.msi ...
- 怎样隐藏Windows7 系统保留分区
安装Windows7操作系统时须要预留出100MB左右的系统保留盘分区.在Windows7激活是必须给它分配盘符,否则无法将其成功激活,但是激活后该盘符永久地显示了出来,怎样将其隐藏掉呢? 1.隐藏前 ...
- 【转载】C#扫盲之:带你掌握C#的扩展方法、以及探讨扩展方法的本质、注意事项
1.为什么需要扩展方法 .NET3.5给我们提供了扩展方法的概念,它的功能是在不修改要添加类型的原有结构时,允许你为类或结构添加新方法. 思考:那么究竟为什么需要扩展方法呢,为什么不直接修改原有类型呢 ...
- shell grep正则匹配汉字
Shell grep正则匹配中文 测试文本 demo_exe.c,内容如下,需要注意保存的编码格式,对输出到终端有影响: 我们中文操作系统ASNI默认是GBK的. #include<stdio. ...
- mac osx 下编译 OpenWrt
默认的文件系统hfs大小写不敏感.新建一个磁盘镜像文件并合式化为hfs+, 然后挂载到系统中. hdiutil create -size 20g -fs "Case-sensitive HF ...
- 图像处理之opencv---常用函数
http://blog.sina.com.cn/s/blog_9c3fc0730100yzwt.html 很全 http://www.xuebuyuan.com/593449.html cvrepea ...
- arcgis for javascript 隐藏或显示底图
arcgis for javascript展示地图的时候,有图层的概念,一层一层的,类似photoshop,在应用界面上控制图层的显隐,是极常见的功能. 但是,如果是控制底图的显示或隐藏呢,怎么搞? ...