题面: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,棋盘题解的更多相关文章

  1. [CSP模拟测试43、44]题解

    状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...

  2. [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)

    题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才.        ...

  3. 蓝桥杯大学B组省赛2020模拟赛(一)题解与总结

    题目链接:https://www.jisuanke.com/contest/6516 A:题目: 我们称一个数是质数,而且数位中出现了 5 的数字是有趣的. 例如 5, 59, 457.求1到1000 ...

  4. WC2019 全国模拟赛第一场 T1 题解

    由于只会T1,没法写游记,只好来写题解了... 题目链接 题目大意 给你一个数列,每次可以任取两个不相交的区间,取一次的贡献是这两个区间里所有数的最小值,求所有取法的贡献和,对 \(10^9+7\) ...

  5. BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3076 https://www.luogu.org/problemnew/show/P3081#sub ...

  6. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解

    上星期打的...题有点水,好多人都AK了 T1排个序贪心就好了 #include<iostream> #include<cstring> #include<cstdlib ...

  7. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  8. [CSP-S模拟测试]:Walk(树的直径+数学)

    题目描述 给定一棵$n$个节点的树,每条边的长度为$1$,同时有一个权值$w$.定义一条路径的权值为路径上所有边的权值的最大公约数.现在对于任意$i\in [1,n]$,求树上所有长度为$i$的简单路 ...

  9. [CSP-S模拟测试]:Walk(BFS+建边)

    题目描述 在比特镇一共有$n$个街区,编号依次为$1$到$n$,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了$m$条单向道路之外,每个街区还有一个编码${val}_i$,不同街区可 ...

随机推荐

  1. 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  2. Git 学习(二)Git 基础

    Git 基础 Git 在保存和对待各种信息的时候与其它版本控制系统如 SVN 等等有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑. Git 记录的是什么? 如果有使 ...

  3. qt5下面中文显示异常

    在源文件中插入# pragma execution_character_set("utf-8")即可

  4. flask-Local源码流程解析

    flask中Local源码数据类型首先明确:源码中要构造的数据类型数是这样的: __storage__ = { 用线程或者协程的唯一标识为键: {stack:[ctx(session/request) ...

  5. PyQt5 安装及简单实例 -- 标签设置

    - 1 -    PyQt5安装,鉴于pip工具,安装其实很简单, 如下:(最好将pip索引配置成国内镜像,速度比默认的快得多) pip3 isntall PyQt5 - 2 -    利用Pycha ...

  6. Android开发 Button的开发记录

    Button置顶层效果取消 android:stateListAnimator="@null" 在代码里执行点击 mButton.performClick(); //点击 mBut ...

  7. CF774L Bars

    题意:给你一个二进制表示是否可以吃巧克力.一共有k个巧克力,第一天和最后一天必须吃.最小化每两次吃巧克力的最大间隔? 标程: #include<bits/stdc++.h> using n ...

  8. drop database出现1010

    > drop database glc; ERROR (HY000): Error dropping database (can't rmdir './glc/', errno: 17) Fri ...

  9. 模拟MySQL命令

    staff_table 1,Alex Li,22,13651054608,IT,2013-04-01 2,Jack Wang,30,13304320533,HR,2015-05-03 3,Rain L ...

  10. Git中.gitignore忽略规则

    # 此为注释 – 将被 Git 忽略 *.a # 忽略所有 .a 结尾的文件 !lib.a # 但 lib.a 除外 /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TO ...