当前位置: 首页 > news >正文

UVa1059/LA2395 Jacquard Circuits

UVa1059/LA2395 Jacquard Circuits

  • 题目链接
  • 题意
    • 输入格式
    • 输出格式
  • 分析
    • 两个坑点
  • AC 代码

题目链接

本题是2007年icpc世界总决赛(东京举办)的D题

题意

古怪的雕刻艺术家 Mondrian 发明了一种称为“提花织物电路板”的艺术品。该艺术品由一系列形状相同,大小不同的多边形电路板构成,层与层之间用细线连接,如下图所示。

方便起见,我们借助于网格来制造这个艺术品。首先需要给定一个称为模板的格点多边形(即各个顶点都是整点的简单多边形)P,代表电路板的形状。接下来寻找一个形状和P 相同的,面积最小的格点多边形作为艺术品的第一层电路板,然后找一个形状相同的,面积第二小的格点多边形作为第二层,依次类推,共M(1≤M≤1 000 000)层。
每个多边形内部的格点(边界上的不算)都会打一个洞,你的任务是求出所有M 个多边形的洞的总数。P 是由N(3≤N≤1 000)个输入点顺次连接而成。

输入格式

输入包含一个或多个测试用例。每个测试用例的第一行包含两个正整数N(3 ≤ N ≤ 1000)和 M(1 ≤ M ≤ 1000000)。N 是 Mondrian 选取的格点数量,M 是完成后的雕塑的层级数。接下来的 N 行中,每行包含两个整数 x, y(|x|, |y| ≤ 1000000),表示模板格点多边形上某个点的坐标。这些点按顺时针或逆时针顺序列出。
最后一个测试用例后面跟着一行两个零。

输出格式

对于每个测试用例,输出一行,其中包含测试用例编号(从 1 开始),以及从给定图案的初始多边形开始构建的 M 层级雕塑中的孔洞数量。在任何情况下,该数值都不会超过 64 位有符号整数的最大值。

分析

利用 pick 定理即可求解本题。说一个如何求某条边( i − 1 , i ) (i-1,i)(i1,i)包含的整点数量的方法:∣ g c d ( x i − x i − 1 , y i − y i − 1 ) ∣ − 1 |gcd(x_i-x_{i-1},y_i-y_{i-1})|-1gcd(xixi1,yiyi1)1。如何找到面积最小的格点多边形呢?对每条边求出g i = ∣ g c d ( x i − x i − 1 , y i − y i − 1 ) ∣ g_i=|gcd(x_i-x_{i-1},y_i-y_{i-1})|gi=gcd(xixi1,yiyi1),记g = g c d { g i } g=gcd\{g_i\}g=gcd{gi},则最小的格点多边形 Q 是模板格点多边形 P 缩小g gg倍,第 K 小的格点多边形是 Q 放大 K 倍。要求所有 M 个格点多边形内整点数总和,将累加的公式推出来即可。

两个坑点

  1. 输入的点可能只是模板格点多边形边界上的点而非顶点。
    比如这条测试数据:
    5 999999 2 2 2 3 2 4 3 4 4 4 0 0
  2. 虽说最终答案不会超过 64 位有符号整数的最大值,但中间涉及多次乘法再做减法再做除法,中间计算结果可能溢出,需要用 __int128_t 过渡一下。

AC 代码

#include<iostream>#include<algorithm>usingnamespacestd;#defineN1002longlongx[N],y[N],m;boolf[N];intn,kase=0;boolcollinear(longlongx1,longlongy1,longlongx2,longlongy2,longlongx3,longlongy3){return(x2-x1)*(y3-y2)==(x3-x2)*(y2-y1);}voidsolve(){for(inti=0;i<n;++i)cin>>x[i]>>y[i],f[i]=true;for(inti=0;i<n;++i){intj=i?i-1:n-1,k=i+1==n?0:i+1;if(collinear(x[j],y[j],x[i],y[i],x[k],y[k]))f[i]=false;}longlongg=0,s=0,t=0;intk=0;for(inti=0;i<n;++i)if(f[i])x[k]=x[i],y[k++]=y[i];for(inti=1;i<k;++i){longlongpx=x[i-1],py=y[i-1],g1=abs(__gcd(x[i]-px,y[i]-py));g=__gcd(g,g1);t+=g1;s+=(x[i]-x[0])*(py-y[0])-(px-x[0])*(y[i]-y[0]);}longlongg1=abs(__gcd(x[0]-x[k-1],y[0]-y[k-1]));g=__gcd(g,g1);t=(t+g1)/g;s=abs(s)/g/g;longlongans=(m*__int128_t(m+1)*(2*m+1)/6*s-m*__int128_t(m+1)/2*t)/2+m;cout<<"Case "<<++kase<<": "<<ans<<endl;}intmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);while(cin>>n>>m&&(m||n))solve();return0;}
http://www.cnnetsun.cn/news/2816288.html

相关文章:

  • TMC2209数据手册没细说的:串口读写通用寄存器的避坑实战(Linux C代码示例)
  • Vue项目里用Stimulsoft Reports.js做报表,从设计到打印的完整配置流程
  • 从Arduino项目反推:电路、模电、数电知识到底怎么用?
  • 从游戏角色到工业协议:一个有趣的比喻帮你彻底搞懂C#中的ModbusRTU主从通信
  • 汽车ECU开发避坑指南:LIN总线帧头(Header)解析与常见同步错误排查
  • 别再手动修音了!用Melodyne Studio 5.3一键分析人声,Adobe Audition内录素材导入全攻略
  • 从迭代器到结构化绑定:一文看懂C++ unordered_map遍历方式的演进与最佳实践
  • 用STM32CubeMX+Keil5快速配置RZ7886电机驱动(附完整代码包)
  • 【2027最新】基于SpringBoot+Vue的学生网上选课系统管理系统源码+MyBatis+MySQL
  • 码头船只货柜管理系统毕业设计源码
  • HLK-W806驱动ST7567 LCD避坑指南:从初始化失败到完美显示的调试全记录
  • 保姆级教程:手把手教你用OBC4为不同总账科目组(如资产、负债)设置差异化的字段必填规则
  • 别再手动配了!用这个技巧批量管理SAP Fiori静态磁贴和目录
  • 别只盯着单片机:用CD4511和共阴数码管,重温数字电路的‘硬核’显示逻辑
  • 汽车电子工程师的LIN总线避坑指南:从帧结构解析到实际车载网络调试(Vector/CANoe工具实操)
  • 从零到自动化:手把手教你用Python脚本调用Redfish API管理服务器(附Postman转Python代码技巧)
  • Pluto SDR新手避坑指南:搞定MATLAB驱动配置,快速搭建你的第一个无线收发链路
  • 告别枯燥理论:用NS-3.35手把手搭建你的第一个点对点网络仿真(附完整代码解析)
  • 模板驱动文档自动化:告别重复劳动的确定性交付方案
  • 用CODESYS ST语言给官方梯形图教程写个仿真,我发现了这些设计细节
  • 哔哩下载姬DownKyi:5分钟掌握B站视频批量下载的终极指南
  • 音频处理实战:用Python快速设计Butterworth滤波器并可视化幅频曲线(附Jupyter Notebook)
  • 别再手动解压了!用Docker在Linux服务器上5分钟部署Matlab 2018b运行环境
  • AD9361接收链路调试踩坑记:从官方配置软件到SPI寄存器,手把手教你避开ENSM状态这个‘大坑’
  • 世界卫生大会健康中国建设 大健康医药产业理论体系数智化健康服务
  • JavaSE 和 JavaEE 是什么意思
  • TOPSIS、AHP、熵权法怎么选?三大决策分析模型对比与避坑指南
  • 别再死记叉乘公式了!用Python和NumPy玩转向量运算与反对称矩阵
  • ESP32 AT固件Web Captive Portal避坑指南:为什么你的热点SSID必须叫‘pos_softap’?
  • C语言指针之二malloc的用法及详解