不知道有几个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 题解的更多相关文章

  1. SDOI2017 Round1 简要题解

    我们 TM 怎么又要上文化课..我 哔哔哔哔哔哔 「SDOI2017」数字表格 题意 有 \(T\) 组数据,求 \[ \prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[ ...

  2. SDOI2017 Round1 Day2 题解

    T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配. 费用流跑得过,可以不用KM. UPD:分数规划用迭代跑得飞快 ...

  3. SDOI2017 Round1

    SDOI2017 Round1 在回去的车上写的 cnblog的markdown貌似有bug,空行都没有了 Day -several [清明节] 没想到在省选之前还会有一次放假 放假前一天晚上走到校门 ...

  4. THUSC2017 Day1题解

    THUSC2017 Day1题解 巧克力 题目描述 "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有 ...

  5. SDOI2017 Round1 起点

    第二次打酱油了 高一两次考试以打两瓶酱油告终 来的时候明知自己没戏,却总存有一丝希望 NOIP连200都没考到,是不是有点儿不自量力 如果我真的去争取那一丝希望的话,该有多好 先简单分析下考试 Day ...

  6. SDOI2017 Round2 详细题解

    这套题实在是太神仙了..做了我好久...好多题都是去搜题解才会的 TAT. 剩的那道题先咕着,如果省选没有退役就来填吧. 「SDOI2017」龙与地下城 题意 丢 \(Y\) 次骰子,骰子有 \(X\ ...

  7. 【NOIP2014】Day1题解+代码

    Day1 T1 签到题,模拟一下随便写就能过. 不过小心像我一样表打错傻逼的调了10min. #include <algorithm> #include <iostream> ...

  8. ZJOI2019 Day1 题解

    想要继续向前,就从克服内心的恐惧开始. 麻将 题意 在麻将中,我们称点数连续的三张牌或三张点数一样的成为面子,称两张点数一样的牌为对子.一副十四张麻将牌的胡牌条件是可以分成四个面子和一个对子或者分成七 ...

  9. Codeforces Global Round1 简要题解

    Codeforces Global Round 1 A 模拟即可 # include <bits/stdc++.h> using namespace std; typedef long l ...

随机推荐

  1. 高通msm8994启动流程简单介绍

    处理器信息 8994包括例如以下子系统: 子系统 处理器 含义 APSS 4*Cortex-A53 应用子系统 APSS 4*Cortex-A57 应用子系统 LPASS QDSP6 v5.5A(He ...

  2. 【Spark】RDD操作具体解释4——Action算子

    本质上在Actions算子中通过SparkContext运行提交作业的runJob操作,触发了RDD DAG的运行. 依据Action算子的输出空间将Action算子进行分类:无输出. HDFS. S ...

  3. Chrome内核保存为mhtml(单网页)

    在地址栏输入:chrome://flags  回车 然后Ctrl+f查找mhtml Tips: 如果网页图片看不太清可以CTRL+鼠标滚轮放大网页 如果系统原因以及其它因素可以下载:QQ浏览器(默认保 ...

  4. MIDI制作的相关软件

    Native Instruments Kontakt(音乐采样器) fl studio 12 v12.5.0.59 汉化版水果   http://xiazai.flstudiochina.com/wm ...

  5. 修改 本地 IP 及 正则表达式 test exec match 的区别

    修改 IP 1.打开 "打开网络和共享中心" 2.打开 "更改适配器设置" 3.打开 "本地连接" 属性 4.修改 "协议版本 4 ...

  6. 怎样把多个Android Project打包成一个APK

    怎样把多个Android Project打包成一个APK(你的项目怎样引用其它项目). 怎样把多个android project 打包成一个apk呢,事实上原理是这种.一个主project引用其它的p ...

  7. Solaris主机间的信任关系机制

    解决问题: 管理员经常在其他服务器之间登录,是否需要密码切换. 知识点:主机间信任关系.R 命令集 /etc/hosts/equiv 文件 R服务是不加密的,别人可以破解. 主机名 + 用户名. + ...

  8. ARM体系结构与编程-5

    GET通经常使用于包括定义常量的源文件. 比如:GET 2440addr.inc 用AREA定义一个段.ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束. 比如: AREA init ...

  9. SGPIO

    http://en.wikipedia.org/wiki/SGPIO SGPIO From Wikipedia, the free encyclopedia   Serial General Purp ...

  10. Linux Kernel Maintainers

    http://en.wikipedia.org/wiki/Ingo_Molnár http://zh.wikipedia.org/wiki/英格·蒙內 Ingo Molnár Ingo Molnár, ...