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$,不同街区可 ...
随机推荐
- [转]C# JSON格式的字符串读取到类中
将JSON格式的字符串读取到类中 本例中建立JSON格式的字符串json,将其内容读取到Person类中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using Syste ...
- Day 14: 内置函数:
Python提供了,许多内置的函数我们按 函数的作用来分类: 一.作用域相关的内置函数(2个) (1).globals() 更改全局变量 (2).locals()更改局并命名空间的变量(上一级) 五. ...
- mysql8以上版本时区问题:The server time zone value乱码XXXX
异常类似: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. ...
- 18-Ubuntu-文件和目录命令-创建文件和目录-touch和mkdir
1.touch 创建文件或修改文件时间 (1)如果文件不存在,可以创建一个空白文件 例: 创建空白文件01.txt touch 01.txt (2)如果文件已经存在,可以修改文件的末次修改时间 例: ...
- 【牛客挑战赛32E】树上逆序对
题目 数据范围非常奇怪,询问的逆序对个数\(k\leq 30000\),我们应该可以把所有的情况都求出来 发现对于树上两点\(x,y\),如果\(x\)是\(y\)的祖先,那么绝对值较大的点的符号决定 ...
- neo4j 基本概念和Cypher语句总结
下面是一个介绍基本概念的例子,参考链接Graph database concepts: (1) Nodes(节点) 图谱的基本单位主要是节点和关系,他们都可以包含属性,一个节点就是一行数据,一个关系也 ...
- HDFS HA
- (依赖注入框架:Ninject ) 一 手写依赖注入
什么是依赖注入? 这里有一个场景:战士拿着刀去战斗: 刀: class Sword { public void Hit(string target) { Console.WriteLine($&quo ...
- manacher/马拉车常用用法一览
因为manacher算法把原来的字符串扩大了两倍,因此在应用时许多二级结论都非常不直观,现场推出来很麻烦,因此笔者在此做个简单整理,如果发现有错误或者有常用的我没有涉及到的,恳请在下方评论区指出,我会 ...
- mysql mac客户端: sequel,mysql-workbench
sequel: https://sequelpro.com/download#auto-start mysql-workbench:https://dev.mysql.com/downloads/fi ...