csp-s模拟65Simple,Walk, Travel,棋盘题解
题面:https://www.cnblogs.com/Juve/articles/11639923.html
simple:
考试时只想到的暴力exgcd判断
考虑n,m互质的情况:
我们枚举y,对于方程$n*x+m*y \leq q$,$x\leq\frac{q-m*y}{n}$
其中y的范围是[0,n-1],因为如果y大于n-1,那么可以使x的系数加一,会有重复
然后如果n,m不互质,那么设$n=n'*gcd(n,m),m=m'*gcd(n,m)$,所以$n'*gcd(n,m)*x+m'*gcd(n,m)*y \leq q$
其中把$gcd(n,m)*y$看成一个整体,那么枚举y的范围要保证$gcd(n,m)*y\in[0,n-1]$
然后就A了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+;
int t,n,m,q,ans;
int gcd(int a,int b){
return b==?a:gcd(b,a%b);
}
int max(int a,int b){return a>b?a:b;}
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&m,&q);
int g=gcd(n,m);
ans=;
for(int i=;i<(n/g);++i){
int x=q-i*m;
if(x<) break;
ans+=x/n+;
}
printf("%lld\n",q-(ans-));
}
return ;
}
walk:
枚举gcd,然后把边权是gcd倍数的边建出来,形成一个森林,求出森林的直径即是答案为gcd时的边的长度
注意一点,有些长度可能不会出现在最长链中,因为他是构成最长链的一部分,所以如果这个长度的答案<长度大于他的答案的话,就要将长度大于他的答案给他,从大到小枚举ans[i]=max(ans[i],ans[i+1]).
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=4e5+5;
const int MAXM=1e6+5;
int n,maxx=0,res[MAXN],len=0;
vector< pair<int,int> >e[MAXM];
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
bool vis[MAXN];
int sta[MAXM],top=0;
int dfs(int x,int fa){
vis[x]=1;
int l=0,r=0;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa||vis[y]) continue;
int p=dfs(y,x);
if(p+1>l) r=l,l=p+1;
else if(p+1>r) r=p+1;
}
len=max(len,l+r);
return l;
}
int main(){
scanf("%d",&n);
for(int i=1,u,v,w;i<n;++i){
scanf("%d%d%d",&u,&v,&w);
maxx=max(maxx,w);
e[w].push_back(make_pair(u,v));
}
for(int i=1;i<=maxx;++i){
cnt=0;
for(int j=i;j<=maxx;j+=i){
int N=e[j].size();
for(int k=0;k<N;++k){
int u=e[j][k].first,v=e[j][k].second;
add(u,v),add(v,u);
sta[++top]=u,sta[++top]=v;
}
}
for(int j=1;j<=top;++j){
if(!vis[sta[j]]){
len=0;
dfs(sta[j],0);
res[len]=max(res[len],i);
}
}
for(int j=1;j<=top;++j){
pre[sta[j]]=vis[sta[j]]=0;
}
top=0;
}
for(int i=n-1;i>=1;--i) res[i]=max(res[i],res[i+1]);
for(int i=1;i<=n;++i) printf("%d\n",res[i]);
return 0;
}
棋盘:
容斥一发推式子:
$ans=\sum\limits_{i=2}^{n}(-1)^i*A_{n}^{i}$
再加个高精度
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
const int MAXN=;
int n,mp[MAXN][MAXN];
struct bigint{
int m[];
inline friend bigint operator * (re bigint a,re int b){
re int x=;
for(re int i=;i<=a.m[];i++){
re int y=a.m[i]*b+x;
a.m[i]=y%;
x=y/;
}
while(x){
a.m[++a.m[]]=x%;
x/=;
}
return a;
}
inline friend void operator += (re bigint &a,re bigint b){
a.m[]=max(a.m[],b.m[])+;
for(re int i=;i<=a.m[];++i)
a.m[i]+=b.m[i];
for(re int i=;i<=a.m[];++i)
if(a.m[i]>) a.m[i]-=,++a.m[i+];
while(a.m[]!=&&a.m[a.m[]]==)
--a.m[];
}
inline friend bigint operator - (re bigint a,re bigint b){
re bigint c;
re int i=;
while((i<=a.m[])||(i<=b.m[])){
if(a.m[i]<b.m[i]){
a.m[i]+=;
a.m[i+]--;
}
c.m[i]=a.m[i]-b.m[i];
i++;
}
while(c.m[i]==&&i>)
i--;
c.m[]=i;
return c;
}
inline friend bigint operator * (re bigint a,re bigint b){
re bigint c;
memset(c.m,,sizeof(c.m));
c.m[]=a.m[]+b.m[]+;
for(re int i=;i<=a.m[];++i){
for(re int j=;j<=b.m[];++j){
c.m[i+j-]+=a.m[i]*b.m[j];
}
}
for(re int i=;i<=c.m[];++i){
if(c.m[i]>) c.m[i+]+=c.m[i]/,c.m[i]%=;
}
while(c.m[]!=&&c.m[c.m[]]==) --c.m[];
return c;
}
}fac[MAXN],C[MAXN][MAXN],ans;
inline void print(bigint a){
for(re int i=a.m[];i>=;--i){
printf("%d",a.m[i]);
}
puts("");
}
signed main(){
//freopen("test.in","r",stdin);
//freopen("ans.out","w",stdout);
scanf("%d",&n);
for(re int i=;i<=n;++i){
for(re int j=,k;j<=n;++j){
scanf("%d",&k);
mp[i][j]=k;
}
}
fac[].m[]=fac[].m[]=;
for(re int i=;i<=n;++i) fac[i]=fac[i-]*i;
C[][].m[]=C[][].m[]=;
for(re int i=;i<=n;++i){
C[i][].m[]=C[i][].m[]=;
for(re int j=;j<=i;++j){
C[i][j]=C[i-][j];
C[i][j]+=C[i-][j-];
//C[i][j]=C[i-1][j]+C[i-1][j-1];
}
}
/*for(int i=1;i<=n;++i){
for(int j=0;j<=i;++j){
print(C[i][j]);
}
puts("");
}*/
ans=fac[n];
for(re int i=;i<=n;++i){
if(i&) ans=ans-C[n][i]*fac[n-i];
else ans+=C[n][i]*fac[n-i];
//ans+=C[n][i];
}
print(ans);
return ;
}
csp-s模拟65Simple,Walk, Travel,棋盘题解的更多相关文章
- [CSP模拟测试43、44]题解
状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- 蓝桥杯大学B组省赛2020模拟赛(一)题解与总结
题目链接:https://www.jisuanke.com/contest/6516 A:题目: 我们称一个数是质数,而且数位中出现了 5 的数字是有趣的. 例如 5, 59, 457.求1到1000 ...
- WC2019 全国模拟赛第一场 T1 题解
由于只会T1,没法写游记,只好来写题解了... 题目链接 题目大意 给你一个数列,每次可以任取两个不相交的区间,取一次的贡献是这两个区间里所有数的最小值,求所有取法的贡献和,对 \(10^9+7\) ...
- BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3076 https://www.luogu.org/problemnew/show/P3081#sub ...
- NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解
上星期打的...题有点水,好多人都AK了 T1排个序贪心就好了 #include<iostream> #include<cstring> #include<cstdlib ...
- [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)
题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...
- [CSP-S模拟测试]:Walk(树的直径+数学)
题目描述 给定一棵$n$个节点的树,每条边的长度为$1$,同时有一个权值$w$.定义一条路径的权值为路径上所有边的权值的最大公约数.现在对于任意$i\in [1,n]$,求树上所有长度为$i$的简单路 ...
- [CSP-S模拟测试]:Walk(BFS+建边)
题目描述 在比特镇一共有$n$个街区,编号依次为$1$到$n$,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了$m$条单向道路之外,每个街区还有一个编码${val}_i$,不同街区可 ...
随机推荐
- 由于某些原因无法博客搬家,现在换马甲了 http://blog.csdn.net/qq_32066409
由于位置原因无法博客搬家,现在换马甲到csdn了地址如下http://blog.csdn.net/qq_32066409
- Windows环境下安装openface
由于昨天在学习人脸识别,就涉及到了openface 我使用的是Windows环境下的pycharm开发工具,昨天一直安装openface但就是没有相关的教程,使用pip install openfac ...
- python批量运行py文件
import os path="E:\\python" #批量的py文件路径 for root,dirs,files in os.walk(path): #进入文件夹目录 for ...
- POJ 3237 /// 树链剖分 线段树区间修改(*-1)
题目大意: 给定树的N个结点 编号为1到N 给定N-1条边的边权. 三种操作: CHANGE k w:将第 k 条边的权值改成 w. NEGATE x y:将x到y的路径上所有边的权值乘 -1. QU ...
- D3.js的基础部分之数组的处理 集合(Set)(v3版本)
数组的处理 之 集合(set) 集合(Set)是数学中常用的概念,表示具有某种特定性质的事物的总体.集合里的项叫做元素.集合的相关方法有: d3.set([array]) //使用数组来构建集合, ...
- PostgreSQL 主键自动增长
建立主键并设置自动增加的办法好好几种,这里记录我测试过的: drop table pro_process; CREATE TABLE "public"."pro_proc ...
- go 简介与包
简介 Go语言是一种新的语言,一种并发的.带垃圾回收的.快速编译的语言.它具有以下特点: 1.它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序. 2.Go语言为软件构造提供了一种模型,它使依赖 ...
- 2018-10-8-Win10-使用-GHO-安装出现-UWP-软件打开闪退-应用商店无法安装软件
title author date CreateTime categories Win10 使用 GHO 安装出现 UWP 软件打开闪退 应用商店无法安装软件 lindexi 2018-10-8 18 ...
- OpenCV-Python Tutorials目录
版本 3.4.6 1 Introduction to OpenCV OpenCV介绍Learn how to setup OpenCV-Python on your computer! 2 Gui F ...
- 微信小程序传递URL中含有特殊字符
小程序传递URL中含有特殊字符"="时,解决办法:先encodeURIComponent,取到值以后再decodeURIComponent 首先在A页面 var urls = en ...