6605 Yukikaze and Demons

exgcd+点分治
点分治统计路径,exgcd求出x∗10len+num≡0(modk)x*10^{len}+num \equiv 0 (mod\ k)x∗10len+num≡0(mod k)
数组O(1)O(1)O(1)查询即可
复杂度问题在于x的个数,因为10len10^{len}10len固定个人感觉是没办法卡的

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,l,r) for(int i=l;i>=r;--i)
using namespace std;
typedef long long s64;const int M=5e5+5;int n,m;
int node_num;
int best_;
int f[M];
int size[M];
int bin[M];
int sta[M];
char s[M];
int e_size,head[M];
s64 ans;bool vis[M];struct edge{int v,nxt;
}e[M*2];void e_add(int u,int v) {e[++e_size]=(edge){v,head[u]};head[u]=e_size;
}int exgcd(int&x,int&y,int a,int b) {if(!b) return x=1,y=0,a;int gcd=exgcd(x,y,b,a%b);int t=x;x=y;y=t-a/b*y;return gcd;
}void dp(int x,int fa) {f[x]=0;size[x]=1;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(v==fa||vis[v]) continue;dp(v,x);size[x]+=size[v];f[x]=max(f[x],size[v]);}f[x]=max(f[x],node_num-size[x]);if(!best_||f[best_]>f[x]) best_=x;
}void add_(int x,int fa,int k,int sum,int t,int ha) {sum=(sum+1ll*k*s[x]%m)%m;sta[sum]+=t;if(ha) ans+= sum==0;//cout<<x<<" "<<sum<<endl;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(vis[v]||v==fa) continue;add_(v,x,10ll*k%m,sum,t,ha);}
}void calc_(int x,int fa,int dep,int sum) {sum=(sum+s[x])%m;size[x]=1;//hardestint xx,yy;int x_,y_;int gcd=exgcd(xx,yy,bin[dep],-m);if(sum%gcd==0) {xx=-sum/gcd*xx;yy=-sum/gcd*yy;if(gcd<0) gcd=-gcd;x_=m/gcd,y_=bin[dep]/gcd;//cout<<"-_-"<<x<<" "<<xx<<" "<<yy<<" "<<bin[dep]<<" "<<-m<<" "<<gcd<<endl;//cout<<x_<<" "<<bin[dep]<<endl;if(xx<0) {int c=(-xx-1)/x_+1;xx+=c*x_,yy+=c*y_;}if(xx>0) {int c=xx/x_;xx-=c*x_,yy-=c*y_;}if(yy<0) {int c=(-yy-1)/y_+1;xx+=c*x_,yy+=c*y_;}while (xx<m) {//cout<<"-_-"<<x<<" "<<xx<<" "<<sta[xx]<<endl;ans+=sta[xx],xx+=x_;}}for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(vis[v]||v==fa) continue;calc_(v,x,dep+1,10*sum%m);size[x]+=size[v];}}void solve(int x) {//cout<<"-_-"<<x<<endl;++sta[s[x]];ans+= s[x]==0;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(vis[v]) continue;add_(v,x,10,s[x],1,1);}//cout<<"-_-"<<endl;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(vis[v]) continue;add_(v,x,10,s[x],-1,0);calc_(v,x,1,0);add_(v,x,10,s[x],1,0);//cout<<"-_-"<<x<<" "<<v<<" "<<ans<<endl;}// while(1);--sta[s[x]];for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(vis[v]) continue;add_(v,x,10,s[x],-1,0);}//cout<<x<<" "<<ans<<endl;vis[x]=1;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(vis[v]) continue;node_num=size[v];best_=0;dp(v,x);solve(best_);}
}void divid_() {best_=0;node_num=n;dp(1,0);solve(best_);
}int main() {//freopen("a.txt","r",stdin);//freopen("a.out","w",stdout);int test_;cin>>test_;while (test_--) {scanf("%d%d%s",&n,&m,s+1);rep(i,1,n) s[i]-='0',s[i]%=m;rep(i,2,n) {int x,y;scanf("%d%d",&x,&y);e_add(x,y),e_add(y,x);}bin[0]=1;rep(i,1,n) bin[i]=10*bin[i-1]%m;divid_();printf("%lld\n",ans);ans=0;e_size=0;rep(i,1,n) vis[i]=head[i]=0;}
}

6608 Fansblog

素数之间间距不会很大,暴力枚举判断即可
(prime−1)!≡1(modprime)(prime-1)! \equiv 1 (mod\ prime)(prime−1)!≡1(mod prime)
除掉暴力枚举的不是素数的数即可

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,l,r) for(int i=l;i>=r;--i)
using namespace std;
typedef long long s64;const int M=1e7+5;s64 mod;
int prime[M];
bool not_prime[M];bool check(s64 x) {for(int i=1;i<=prime[0] && 1ll*i*i<=x;++i) if(x%prime[i]==0) return 0;return 1;
}s64 mul(s64 a,s64 b,s64 mod) {s64 ans=a*b-(s64)((long double)a/mod*b+0.5)*mod;return ans<0?ans+mod:ans;
}s64 qmul(s64 a,s64 k,s64 mod) {s64 ans=1;for(;k;k>>=1,a=mul(a,a,mod)) if(k&1) ans=mul(a,ans,mod);return ans;
}int main() {//freopen("a.txt","r",stdin);//freopen("a.out","w",stdout);rep(i,2,10000000) {if(!not_prime[i]) prime[++prime[0]]=i;rep(j,1,prime[0]) {if(i*prime[j]>10000000) break;not_prime[i*prime[j]]=1;if(i%prime[j]==0) break; }}int test_;cin>>test_;while (test_--) {cin>>mod;s64 x=mod-1,ans=mod-1;while (!check(ans)) {x=mul(x,qmul(ans,mod-2,mod),mod);--ans;}cout<<x<<endl;}
}

6611 K Subsequence

费用流
优化建图ai≤aj≤aka_{i} \leq a_{j} \leq a_{k}ai​≤aj​≤ak​只建边(i,k)(i,k)(i,k)
这样会错,再加上(i,i′,flow=m,cost=0)(i,i',flow=m,cost=0)(i,i′,flow=m,cost=0)即可
注意pre[S]要清空
只有一组数据不清空是可以的,因为pre[S]从来都是0
但是多组数据pre[S]会被上一组修改
就TLE了
感觉oi和acm还真的是不太一样啊

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,l,r) for(int i=l;i>=r;--i)
using namespace std;const int M=5e3+5;
int n,m;
int a[M];
int S,SS,T;
int e_size,head[M];
bool inq_[M];
int dis[M],pre[M];struct edge{int u,v,w,c,nxt;
}e[M*100];void e_add(int u,int v,int w,int c) {e[++e_size]=(edge){u,v,w,c,head[u]};head[u]=e_size;
}void insert(int u,int v,int w,int c) {e_add(u,v,w,c),e_add(v,u,0,-c);
}void spfa() {memset(dis,-0x3f,sizeof(dis));queue <int> q;dis[S]=0;q.push(S);pre[S]=0;while (!q.empty()) {int r=q.front();q.pop();inq_[r]=0;for(int i=head[r];i;i=e[i].nxt) {int v=e[i].v;if(dis[v]<dis[r]+e[i].c&&e[i].w) {pre[v]=i;dis[v]=dis[r]+e[i].c;if(!inq_[v]) inq_[v]=1,q.push(v);}}}
}void feiyong() {int ans=0;while (spfa(),dis[T]>0) {int t=1e9;for(int i=pre[T];i;i=pre[e[i].u]) t=min(t,e[i].w);ans+=t*dis[T];for(int i=pre[T];i;i=pre[e[i].u]) e[i].w-=t,e[i^1].w+=t;}printf("%d\n",ans);
}int main() {//freopen("a.txt","r",stdin);int test_;cin>>test_;while (test_--) {scanf("%d%d",&n,&m);rep(i,1,n) scanf("%d",a+i);e_size=1;memset(head,0,sizeof(head));S=2*n+5,SS=S+1,T=SS+1;insert(S,SS,m,0);rep(i,1,n) insert(SS,i,m,0),insert(i,i+n,1,a[i]),insert(i,i+n,m,0),insert(i+n,T,m,0);rep(i,1,n) {int pre=2e5;rep(j,i+1,n) if(a[i]<=a[j]&&pre>a[j]) {pre=a[j];insert(i+n,j,m,0);}}feiyong();}
}

6613 Squrirrel

直接树形dp
f[i][0/1]f[i][0/1]f[i][0/1]代表i的子树中是否使用边时最大深度最小的情况
同理g[i][0/1]g[i][0/1]g[i][0/1]是除掉i的子树…
线性dp即可

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,l,r) for(int i=l;i>=r;--i)
using namespace std;const int M=2e5+5;int n;
int e_size,head[M];
int fa[M];
int f[M][2],g[M][2];
int ans[M];struct edge {int v,w,nxt;
}e[M*2];void e_add(int u,int v,int w) {e[++e_size]=(edge) {v,w,head[u]};head[u]=e_size;
}void dp1(int x) {for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(v==fa[x]) continue;fa[v]=x;dp1(v);}f[x][0]=f[x][1]=0;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(v==fa[x]) continue;f[x][1]=min( min( max(f[x][1],f[v][0]+e[i].w) , max(f[x][0],f[v][1]+e[i].w) ) , max(f[x][0],f[v][0]) );f[x][0]=max(f[x][0],f[v][0]+e[i].w);}//cout<<"-_-"<<x<<" "<<f[x][0]<<" "<<f[x][1]<<endl;
}void dp2(int x) {if(fa[x]) {g[x][0]=g[x][1]=0;g[x][0]=g[fa[x]][0];g[x][1]=g[fa[x]][1];int sum=0;for(int i=head[fa[x]];i;i=e[i].nxt) {int v=e[i].v;if(v==x) sum=e[i].w;if(v==fa[fa[x]]||v==x) continue;g[x][1]=min( min( max(g[x][1],f[v][0]+e[i].w) , max(g[x][0],f[v][1]+e[i].w) ) , max(g[x][0],f[v][0]) );g[x][0]=max(g[x][0],f[v][0]+e[i].w);}g[x][1]=min(g[x][1]+sum,g[x][0]);g[x][0]+=sum;}//cout<<x<<" "<<g[x][0]<<" "<<g[x][1]<<endl;for(int i=head[x];i;i=e[i].nxt) {int v=e[i].v;if(v==fa[x]) continue;dp2(v);}
}int main() {//freopen("a.txt","r",stdin);int test_;cin>>test_;while (test_--) {scanf("%d",&n);rep(i,2,n) {int x,y,z;scanf("%d%d%d",&x,&y,&z);e_add(x,y,z),e_add(y,x,z);}dp1(1);dp2(1);rep(i,1,n) f[i][1]=min(f[i][1],f[i][0]),g[i][1]=min(g[i][1],g[i][0]);rep(i,1,n) ans[i]=min( max(f[i][1],g[i][0]) , max(g[i][1],f[i][0]) );int p=1;rep(i,2,n) if(ans[i]<ans[p]) p=i;printf("%d %d\n",p,ans[p]);//rep(i,1,n) printf("%d ",ans[i]);//puts("");e_size=0;rep(i,1,n) head[i]=0;}
}

2019多校 7.29相关推荐

  1. 2019年1月29日

    2019年1月29日星期二 一:SQL注入专题 1.MySQL与SQLserver数据库中的默认的表有哪些? 2.什么是SQL注入 SQL 注入是一种将 SQL 代码插入或添加到应用(用户)的输入参数 ...

  2. 18日精读掌握《费曼物理学讲义-卷一》计划(2019/6/12-2019/6/29)

    本篇目录 18日精读掌握<费曼物理学讲义-卷一>计划概览 作者介绍: 本书内容介绍: 本书目录 书本封面 18日精读掌握<费曼物理学讲义-卷一>计划概览 我将在接下来的18天掌 ...

  3. Navicat Premium12安装_破解(亲测成功)时间:2019年7月29日

    2019年7月29日 亲测成功 1.下载 下载地址: 已经破解完毕版本下载:https://pan.baidu.com/s/1hwOf5-6E1jRLDFW9KuYPpg 提取码: i4q6 需要破解 ...

  4. HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)

    HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578) Problem Description T ...

  5. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  6. 杭电2019多校第三场 HDU-6608 Fansblog

    题目:Fansblog 题意大致描述:给定一个质数P(1e9≤P≤1e14),找到比P小的最大的质数Q,并求出Q!%P 需要了解的知识 威尔逊定理 在初等数论中,威尔逊定理给出了判定一个自然数是否为素 ...

  7. 2019年12月23日--2019年12月29日(合计38小时,剩9962小时)

    2019年12月23日 1,HLSL精讲,19.3剪裁 2,3d图形数学:2.4及相应代码 3,windows核心编程:6.5.2 4,鬼火引擎,ISceneNode 5,整合gis代码 6,cesi ...

  8. 【hdu6588】2019多校第一场K题function,反演

    题目 枚举gcd,最后化简得∑i=1n3φ(x)∑i=1⌊nx⌋[x∣⌊xi3⌋]\sum^{\sqrt[3]{n}}_{i=1}φ(x)\sum^{\lfloor \frac n x\rfloor} ...

  9. 2019多校第一场 HDU6578 - Blank(DP,思维,滚动数组优化空间)

    链接:HDU6578 - Blank 题意: 有 n (≤100) 个格子,向其中填入 0.1.2.3 这4个数,但是有 m (≤100) 个限制 限制 l r x :表示 l ~ r 的格子内不同的 ...

  10. 杭电2019多校第三场 HDU-6608 Fansblog(威尔逊定理+素数间隔+逆元)

    威尔逊定理:在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于实际操 ...

最新文章

  1. C#的修饰符作用的范围
  2. python 链表中倒数第k个节点
  3. 用掘金-Markdown 编辑器写文章
  4. QT的QFileDialog类的使用
  5. css 旋转45_CSS教程——第14期
  6. Linux操作系统多线程信号总结(转)
  7. hfss螺旋平面_微波射频网HFSS平面螺旋天线设计
  8. word上怎么把图片拼接到一起_图片合并,WORD如何将文字与图片合并
  9. 基于transformer的车辆识别
  10. PHP利用JWT实现token和refresh_token
  11. MongoDB Could not find host matching read preference { mode: \primary\ } for set repl_shard1
  12. 天翼云主机安装php环境,使用PHP空间和天翼云盘搭建私人云盘
  13. 023_fireshot
  14. github - You have exceeded a secondary rate limit.
  15. 《脑与语言认知 江铭虎》读书总结
  16. 【C/C++学院】0901-设计模式的汇总演练
  17. 分享几个实用的Chrome扩展程序
  18. TCP扫描增强器实现65000端口,10S完成,快准狠(Go语言编程)
  19. 无线渗透----kismet工具使用
  20. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记39 AlertActionSheet

热门文章

  1. UML建模工具 Visual Paradigm敏捷开发教程(一):如何确立项目愿景
  2. 基于SSM的Web网页聊天室系统
  3. 我国的离婚率现状,通过数据的可视化展示,来直观的展现给大家
  4. 不足200行代码,我用python写了一个上课点名系统。还没开学的你们慌了吗?
  5. MATLAB判断梅森素数,指数式的梅森素数和斐波那契素数有无穷多个获证
  6. Java+HTML预习笔记_20140610
  7. 图像算法---头发检测算法研究
  8. ae合成设置快捷键_AE软件中最常用快捷键大全(学AE必备)
  9. Altium Designer PCB常用规则中英文对照
  10. 学习软件测试有哪些优势?