题面: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. [转]ThinkPHP分页实例

    很多人初学thinkphp时,不太熟悉thinkphp的分页使用方法,现在将自己整理的分页方法分享下,有需要的朋友可以看看.   控制器中的代码:   $db = M("cost" ...

  2. HDU1285-确定比赛名次-拓扑排序板子题

    有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...

  3. SparkSession、SparkContext、SQLContext和HiveContext之间的区别。

    SparkContext 是什么? 驱动程序使用SparkContext与集群进行连接和通信,它可以帮助执行Spark任务,并与资源管理器(如YARN 或Mesos)进行协调. 使用SparkCont ...

  4. 尾插法-实现链表反转(有点bug,以后再来研究下)

    def func2(head): p = head.next while p.next: q = p.next p.next = q.next # 重点 head.next = q q.next = ...

  5. 中文linux安装oracle界面乱码解决方案

    来自:http://blog.csdn.net/h249059945/article/details/12122853 在linux的中文操作系统下使用xmanager进行oracle进行安装的时候, ...

  6. 随笔记录 MBR扇区故障系统备份与还原 2019.8.7

    系统备份: [root@localhost ~]# mkdir /abc [root@localhost ~]# mount /dev/sdb1 /abc [root@localhost ~]# dd ...

  7. Vultr IP被墙该怎么办

    我们创建好Vultr服务器时候,首先需要检测IP地址是否可用,很多IP在国内被墙,导致使用Xshell连接不上,虽然IP能够ping通,但是SSH依然连接不上.那Vultr IP被墙该怎么办呢? 方法 ...

  8. node---处理get请求

    const http=require('http') const querystring=require('querystring') const server = http.createServer ...

  9. ibator配置文件说明文档

    1. <classPathEntry>  属性名 说明 示例 location 数据库驱动文件路径 lib/mysql-connector-java-5.1.6-bin.jar   2.  ...

  10. 基于vue的环信基本实时通信功能

    本篇文章借鉴了一些资料,然后在这个基础上,我将环信的实现全部都集成在一个组件里面进行实现: https://blog.csdn.net/github_35631540/article/details/ ...