等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)

文章目录

  • T1:等比数列三角形
    • 题目
    • 题解
    • 代码实现
  • T2:电报
    • 题目
    • 题解
    • 代码实现

T1:等比数列三角形

题目

求三边都是 ≤n 的整数,且成等比数列的三角形个数
注意三角形面积不能为 0
注意 oeis 中未收录此数列,所以并不需要去搜了

输入格式
一行一个整数 n
输出格式
一行一个整数表示答案

样例
样例输入1
9
样例输出1
10
样例解释1
除去 9 个等边三角形,还有 {4,6,9} 。

样例输入2
100
样例输出2
133

数据范围与提示
一共有 4 个子任务,对于每一个子任务,你只有通过了该子任务的所有测试点,才能获得此子任务的分数
有 10pts,保证 n≤10
有 20pts,保证 n≤105
有 20pts,保证 n≤105
有 50pts,保证 n≤1012
对于所有数据,有1≤ n≤1012

题解

在这里插入图片描述
注意{4,6,9},{6,4,9},{9,6,4}算同一个三角形,所以不用管顺序
设三条边从小到大分别为a,ak,ak2a,ak,ak^2a,ak,ak2(kkk为公比且为正整数)
所以1≤k1≤k1k


就然要构成三角形,必然要满足
a+ak>ak2=>1+k>k2=>k2−k−1<0a+ak>ak^2=>1+k>k^2=>k^2-k-1<0a+ak>ak2=>1+k>k2=>k2k1<0
解得k<√5+12k<\frac{√5+1}{2}k<25+1

综上k∈[1,√5+12)k∈[1,\frac{√5+1}{2})k[1,25+1)


接下来令k=pqk=\frac{p}{q}k=qp(q,pq,pq,p互质),最大边就表示为a∗p2q2a*\frac{p^2}{q^2}aq2p2
最大边≤n≤nn,故此q≤√nq≤√nqn
因为q=pkq=\frac{p}{k}q=kp,那么

  • kkk取最大时,qqq取最小,把k=√5+12k=\frac{√5+1}{2}k=25+1带入就解出了qqq的最小值,
    但因为k取不到这个开区间,q的这个最小值也是一个开区间
  • 当k取最小时,qqq取最大,这是满足q=pq=pq=pqqq的这个最大值是一个闭区间

综上q∈(p∗2√5+1,p]q∈(p*\frac{2}{√5+1},p]q(p5+12,p],在这里有个转化思想,把ppp代换成qqq,得到q∈(q∗2√5+1,q]q∈(q*\frac{2}{√5+1},q]q(q5+12,q]
我们就可以枚举p∈[1,√n]p∈[1,√n]p[1,n],算出此时q的可取值个数
注意:其实理解成枚举qqq也是说得通的
在这里插入图片描述


当这样统计完后,会出现一个问题
{2,3,6},{4,6,9}\{2,3,6\},\{4,6,9\}{236},{469}这种公比为32\frac{3}{2}23的三角形,会被重复计算进公比为64\frac{6}{4}46
所以我们需要把这些排除掉,这也是为什么上面推导的时候pq\frac{p}{q}qp要保证互质
这里就可以用类似埃筛的方法,把xxx的因数里面算过的三角形减掉

要正着减,如果倒着,公比为128\frac{12}{8}812会先减掉公比为96\frac{9}{6}69而这里面还包含着32\frac{3}{2}23
会导致32\frac{3}{2}23被重复减掉


代码实现

#include <cstdio>
#include <cmath>
using namespace std;
#define LL long long
#define MAXN 1000005
LL n, result;
int ok[MAXN];
int main() {scanf ( "%lld", &n );int sqt = sqrt ( n );for ( int i = 1;i <= sqt;i ++ ) {int t = i * ( 2 / ( sqrt ( 5 ) + 1 ) );ok[i] = i - t;}for ( LL i = 1;i <= sqt;i ++ )for ( LL j = i << 1;j <= sqt;j += i )ok[j] -= ok[i];for ( LL i = 1;i * i <= n;i ++ )result += ( n / ( i * i ) ) * ok[i];printf ( "%lld", result );return 0;
}

T2:电报

题目

给出 n 个点,每个点的出度均为 1,给出这 n 个点初始指向的点A[i] ,和改变这个点指向的目标所需要的价值 C[i]。
求让所有点强连通的最小花费。

输入格式
第一行输入一个数 n 表示点的个数。
之后的 n 行每行两个数 A[i],C[i] 表示第 i 个点指向第 A[i] 个点,更改该点指向的点花费为 C[i]。
输出格式
共一行,为让所有点强连通的最小花费。

样例
样例输入 1
4
2 2
1 4
1 3
3 1
样例输出 1
4
样例解释 1
在这里插入图片描述
很显然,把 1–>2 的这条边改成 (花费 4)的情况下构成强连通分量花费最小。

样例输入 2
4
2 2
1 6
1 3
3 1
样例输出 2
5
样例解释 2
很显然把 1–>2 的这条边改成 1–>4 花费 2,把 3–>1 的这条边改成 3–>2 花费 3 的情况下构成强连通分量花费最小,总花费为 5。

样例输入 3
4
2 2
1 3
4 2
3 3
样例输出 3
4

样例输入 4
3
2 1
3 1
1 1
样例输出 4
0
在这里插入图片描述

题解

在这里插入图片描述
首先为了能变成强连通,树上的点彼此之间需要破掉,先不动环上的点

如图中:7,8,97,8,978910,11,12,1310,11,12,1310111213就必须破掉,破成一条链

要么把7→87\rightarrow878破掉,要么把7→97\rightarrow979破掉,然后让7−8−97-8-9789连成一条链

可以用拓扑排序找到不是环上的点,然后把这棵树破成链,如果本身是链就不进行操作

图就变成多个环和多棵树的形态

显然,环彼此之间是相互独立的,就可以扫一次先处理出所有的环

我们在上面进行树上破成链的时候,把环延伸的链或树也一起破掉

如图中:就把6→76\rightarrow7676→106\rightarrow10610都给破掉

接着如果变成强连通,环与环之间必须相互有路去连通

就是复活环与之外连的某一条边

意味着我们要把环破掉一条边和外界相连
在这里插入图片描述
那么这个时候,对于环上的最佳答案点肯定满足把它与它父亲在环上的边破掉,然后把它与自己延伸的链的点进行相连的操作花费最小

破环就是自己的CCC值,与链上的点保留一条边,就是找链上点的CCC的最大值

如图中:我们要把6→16\rightarrow161破掉,复活6→76\rightarrow767或者6→106\rightarrow10610任意一条边

而且必须复活至少一条,这样才能让环与外面进行连通

但是如果图上有多个点的复活值是负数,那么肯定是全选上,使答案变得更小

在上面破 环与链的边 的时候,我们就记录最大值的CCC,复活的时候,肯定复活这一条边,其他边的消耗远小于这一条边破掉的消耗


最后我们来解释一下代码的一些地方,旁边的小姐姐问了我很久

  • 为什么是建反图:
    想一想,如果我们建正图,每个点都只会有一个指向点,即每个点的vector里面都只有111个点,怎么破链,复活等以上的操作呢?
    换言之,每个点要知道自己的后继,才能知道破哪些边

  • flag||tot>1的问题,我们要知道
    当只有环的时候,如果环是多个,也需要破掉,使所有环彼此强连通
    当只有一个环的时候,如果环上有链也需要破掉,不然环上的点无法走到链上的点
    所以这里是取或,当且仅当原图本身就是一个环才不用考虑复活


在这里插入图片描述

代码实现

这里定义isCircle[i]
1:表示这个点不在环上(PS:可能误导了许多亲故 )
2:表示这个点在环上且已经经过了破树或破链处理
0:表示这个点在环上但等待被处理

#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 100005
queue < int > q;
vector < int > G[MAXN], circle[MAXN];
int n, tot;
bool flag;
int a[MAXN], c[MAXN];
int d[MAXN], g[MAXN], isCircle[MAXN];
long long result;int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%d %d", &a[i], &c[i] );G[a[i]].push_back ( i );d[a[i]] ++;}for ( int i = 1;i <= n;i ++ )if ( ! d[i] ) {q.push ( i );isCircle[i] = 1;flag = 1;}while ( ! q.empty() ) {int t = q.front();q.pop();d[a[t]] --;if ( ! d[a[t]] ) {q.push ( a[t] );isCircle[a[t]] = 1;}}for ( int i = 1;i <= n;i ++ ) {if ( isCircle[i] == 1 ) {//破树为链int Max = 0;for ( int j = 0;j < G[i].size();j ++ ) {Max = max ( Max, c[G[i][j]] );result += c[G[i][j]];}result -= Max;}else {for ( int j = 0;j < G[i].size();j ++ )if ( isCircle[G[i][j]] == 1 ) {//破环与外面延伸的链g[i] = max ( g[i], c[G[i][j]] );//记录一条链的最大值result += c[G[i][j]];}if ( isCircle[i] == 0 )tot ++;int x = i;while ( isCircle[x] == 0 ) {//分离出环isCircle[x] = 2;circle[tot].push_back ( x );x = a[x];}}}if ( flag || tot > 1 ) {for ( int i = 1;i <= tot;i ++ ) {int Min = 0x3f3f3f3f;for ( int j = 0;j < circle[i].size();j ++ )//复活Min = min ( Min, c[circle[i][j]] - g[a[circle[i][j]]] );if ( Min >= 0 )//必须复活的一条边result += Min;else {for ( int j = 0;j < circle[i].size();j ++ )if ( c[circle[i][j]] - g[a[circle[i][j]]] < 0 )//可多复活几条边result += c[circle[i][j]] - g[a[circle[i][j]]];//破掉i与fi的环上边的时候,接的那一条边肯定是接在fi上}}}printf ( "%lld", result );return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PerfView监测.NET程序性能(三):分组

在上一篇博客使用PerfView监测.NET程序性能&#xff08;二&#xff09;&#xff1a;Perfview的使用中&#xff0c;我们通过Perfview帮助文件中自带的代码来简单使用了Perfview&#xff0c;了解了基本操作。现在来看看Perfview中的分组操作&#xff08;Grouping&#xff09;。分…

【做题记录】构造题

CF468C Hack it! 题意&#xff1a; 令 \(F(x)\) 表示 \(x\) 的各个位上的数字之和&#xff0c;如 \(F(1234)123410\) 。 给定 \(a(a\le 10^{18})\) &#xff0c;请求出任意一组 \(l,r(l,r\le 10^{200})\) &#xff0c;要求满足&#xff1a; \[\sum_{il}^{r}F(i)\pmod{a}0 \]输出…

Star Way To Heaven (prim最小生成树) // [ NOIP提高组 2014]飞扬的小鸟(DP)

文章目录T1&#xff1a;Star Way To Heaven题目题解代码实现T2&#xff1a;飞扬的小鸟题目题解代码实现T1&#xff1a;Star Way To Heaven 题目 小 w 伤心的走上了 Star way to heaven。 到天堂的道路是一个笛卡尔坐标系上一个 n*m 的长方形通道 顶点在 (0,0) 和 (n,m) 。 小…

IdentityServer4-客户端的授权模式原理分析(三)

在学习其他应用场景前&#xff0c;需要了解几个客户端的授权模式。首先了解下本节使用的几个名词Resource Owner&#xff1a;资源拥有者&#xff0c;文中称“user”&#xff1b;Client为第三方客户端&#xff1b;Authorization server为授权服务器&#xff1b;redirection URI&…

[2019 牛客CSP-S提高组赛前集训营4题解] 复读数组(数论)+ 路径计数机(数上DP)+ 排列计数机(线段树+二项式定理)

文章目录T1&#xff1a;复读数组题目题解代码实现T2&#xff1a;路径计数机题目题解代码实现T3&#xff1a;排列计数机题目题解CODET1&#xff1a;复读数组 题目 有一个长为nk的数组&#xff0c;它是由长为n的数组A1,A2,…,An重复k次得到的。 定义这个数组的一个区间的权值为…

微软携手 Docker 打造 CNAB,分布式应用来了!

微软中国MSDN 前天Microsoft Connect(); 2018发布的众多最新科技&#xff0c;都让全球开发者惊艳不已。其中一项最令开发者瞩目并迫不及待——微软联合Docker发布了云本地应用捆绑包&#xff08;Cloud Native Application Bundle&#xff0c;以下简称CNAB&#xff09;&#xff…

[C++]试一试结构体struct node的构造函数

可直接点击跳转到构造函数处结构体概念定义结构体定义结构体及结构体变量结构体变量的特点成员调用成员函数调用结构体的构造函数Upd1Upd2Upd3结构体概念 在实际问题中&#xff0c;一组数据往往具有不同的数据类型。 例如&#xff1a;人口大普查时&#xff0c;需要记录每一个人…

[多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)

文章目录T1&#xff1a;分数转换题目题解代码实现T2&#xff1a;Slow Path Finding Algorithm题目题解代码实现T3&#xff1a;切面包题目题解代码实现T1&#xff1a;分数转换 题目 Time limit: 1.5 seconds Memory limit: 512 megabytes 给定一个十进制小数&#xff0c;请你…

P3992 [BJOI2017]开车

P3992 [BJOI2017]开车 题意&#xff1a; 题解&#xff1a; 我们要先将问题转换 圈是车&#xff0c;x是加油站。红色部分为车移动的路线 数组a是车数量的前缀和 数组b是加油站的前缀和 而a[i]与b[i]的差的绝对值就是对应的红色路被走的次数 现在车发生位置移动&#xff0c;b数…

IdentityServer4-MVC+Hybrid实现Claims授权验证(四)

上节IdentityServer4-客户端的授权模式原理分析&#xff08;三&#xff09;以对话形式&#xff0c;大概说了几种客户端授权模式的原理&#xff0c;这节重点介绍Hybrid模式在MVC下的使用。且为实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置打下…

漫谈何时从单体架构迁移到微服务?

面对微服务如火如荼的发展&#xff0c;很多人都在了解&#xff0c;学习希望能在自己的项目中帮得上忙&#xff0c;当你对微服务的庐山真面目有所了解后&#xff0c;接下来就是说服自己了&#xff0c;到底如何评估微服务&#xff0c;什么时候使用微服务&#xff0c;什么时间点最…

[CSP-S Day1,Day2 游记]提高组考后总结及学习编程C++以来的心得体会

怀着沉重而感慨的心情写下了这篇blog考试中暴露的问题Day1Day2综上解决方法学习历程及以来的心得体会职业精神这篇博客我可能会写好几天&#xff0c;我jio得这篇博客对我的学习历程以及态度产生深刻影响考试中暴露的问题 首先先说这次提高组考试的每道题所遇到的各种问题吧 Da…

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

上篇文章介绍了基于Ids4密码授权模式&#xff0c;从使用场景、原理分析、自定义帐户体系集成完整的介绍了密码授权模式的内容&#xff0c;并最后给出了三个思考问题&#xff0c;本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的&#xff0c;如何验证access_t…

P5049 [NOIP2018 提高组] 旅行

P5049 [NOIP2018 提高组] 旅行 题意&#xff1a; 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 1≤n≤500000 mn−1 或 mn 题解&#xff1a; 如果不是基环树&#xff0c;那直接每次走字典…

[2019CSP-S Day1]提高组Day1题解(格雷码[模拟(k转二进制取反的做法带证明)] + 括号树[DP] + 树上的数(暴力+菊花图+单链))

Day1T1&#xff1a;格雷码题目题解代码实现T2&#xff1a;括号树题目题解代码实现T3&#xff1a;树上的数题目10pts暴力题解代码实现25pts菊花图题解代码实现25pts单链题解代码实现T1&#xff1a;格雷码 题目 通常&#xff0c;人们习惯将所有 n位二进制串按照字典序排列&…

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

在上一篇文章使用PerfView监测.NET程序性能&#xff08;三&#xff09;&#xff1a;分组中&#xff0c;我们使用了Perfview的分组功能。分组功能旨在对某些函数按照某个格式进行分组&#xff0c;以减少视图中的各种无关函数的数量。但仅有分组还不够&#xff0c;有时我们想将一…

带旋treap概念及模板,带例题:普通平衡树

带旋Treap二叉查找树BST(Binary Search Tree)定义Treap定义模板合集&#xff08;均为O(logn)O(logn)O(logn)&#xff09;push_up模板旋转模板插入模板删除模板查找前驱模板查找后驱模板查找键值key模板查找节点的修正值rank模板PS&#xff1a;rd的比较问题例题&#xff1a;普通…

微服务系列实践 .NET CORE

从事这个行业转眼已经6年了&#xff0c;从当初刚毕业的在北京朝八晚十&#xff0c;从二环到五环&#xff0c;仍每天精力充沛的小愤青&#xff1b;再到深圳一点一滴的辛勤在软件行业的耕种&#xff0c;从当初单体应用架构到现在微服务架构的经历&#xff0c;回想起来自己的收获倒…

P2607 [ZJOI2008]骑士

P2607 [ZJOI2008]骑士 题意&#xff1a; n个点n个边&#xff0c;每个点都有权值&#xff0c;相邻的点不能同时选择&#xff0c;问如何选择能使得权值最大 题解&#xff1a; 这个题很有P1352 没有上司的舞会这个题的感觉&#xff0c;唯一的区别是那个题保证是树&#xff0c;…

模板:线段树优化建图

前言 百川到海&#xff0c;天下归一 解析 线段树优化建图是用于对一个区间的点连边时的优化方法 建一棵in树一棵出树分别往上和下指即可 大概长这样 &#xff08;pia的洛谷的照片&#xff09; 建树 正常动态开点即可 void build(int &k,int l,int r){tr[ktot](tree){0…