ZOJ3825(2014年牡丹江现场赛G题)

SpringBoot和Vue哈尔滨文旅系统源码 包含前后端源码、SQL初始化脚本和启动说明。JDK 17、Spring Boot、Vue;默认H2演示数据库。 立即下载

比赛时读这题一开始感觉并不难,思路好像蛮容易想的,但是现场没有一支队过了这题……最后一小时上机打了这题,在终场前十秒提交,可惜结果自然是WA……

比完赛这几天好好想了下这题,WA了好多次,期间还尝试用JAVA来写,结果都没有成功……

最后特么终于用C++把这题AC了……虽然是用Mathematica打了个对拍查了很久错误,不算是完全自己做出来的……

这题题意大致可以转化为:给定一个圆x^2+y^2<=R^2和一条直线A x+B y+C=0,其中A,B,R是数量级10^8的整数,C是数量级10^16的整数,求这条直线在这个圆内及边界上经过的整点个数。这里我们可以假设gcd(A,B)=1,因为若gcd(A,B)不能整除C,这个方程无解;若能整除,A,B,C同时除以gcd(A,B)后可使x,y的系数互质。

思路其实很直观。首先可以用拓展欧几里得算法求出A x+B y+C=0的一个特解(-CX,-CY),这里的X,Y满足AX+BY=1(当然因为精度问题程序中我们求出(X,Y)后不能直接求出特解,这里(-CX,-CY)只作为记号)。显然求出特解后,A x+B y+C=0上所有整点都必有形式(x,y)=k(B,-A)+(-CX,-CY),k是整数。那么,就应该有(kB-CX)^2+(-kA-CY)^2=0,化简即有k要在[(C(BX-AY)-S)/(A^2+B^2),(C(BX-AY)+S)/(A^2+B^2)]:=[T1,T2]中,这里S=sqrt(R^2(A^2+B^2)-C^2),接下来只要求这个闭区间里整数点的个数即可。

但是,因为S^2已经到了10^32的数量级,C(BX-AY)的数量级也达到了10^24,正常方法直接用double 甚至是long double精度都是不够的,而因为这个问题我也WA了很多次。要做出这题,后来我发现必须完全避开浮点数的运算,才能保证精度。注意到,首先如果将整个区间整体左移或者右移整数个单位,整数点的个数是不变的。这样,首先我们可以给区间端点把分子中的C(BX-AY)用C(BX-AY)%(A^2+B^2)替代,而这个取余虽然被除数超出long long精度但仍是可以用程序实现的。其次,注意到S用floor(S)替代对结果是没有影响的,因为[T1,T2]中整数点个数等于floor(T2)-ceil(T1)+1。其中若k=floor(T2),一定有k(A^2+B^2)<=S+...,由左式是整数可知右式向下取整不影响不等式的正确性。对于ceil(T1)的讨论类似。

那么现在,我们需要做的事情就是,写一个高精度整数类表示至少达到10^32整数,并且对于一个整数可以快速求出不超过它平方根的最大整数(这个整数可直接用long long表示)。最后,因为T1,T2都是有理数,那么求floor和ceil时我们不需要转化为浮点数运算,直接相除即可,当然要注意T1,T2的符号这些细节。具体实现可见代码。

最后感叹一句啊,为什么我比赛要开这么道神题啊……

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;

typedef long long ll;
typedef long double lf;
const ll mod=10000000;
const int maxn=6;

struct bigint
{
	ll a[maxn];
	bigint(ll tet=0)
	{
		memset(a,0,sizeof(a));
		for(int i=0;i<maxn;i++)
		{
			a[i]=tet%mod;
			tet/=mod;
		}
	}
};
bool operator <(bigint a,bigint b)
{
	int i,j;
	for(i=maxn-1;i>=0;i--)
		if(a.a[i]!=b.a[i])
			return a.a[i]<b.a[i];
	return false;
}
bool operator ==(bigint a,bigint b)
{
	return !(a<b)&&!(b<a);
}
bigint operator +(bigint a,bigint b)
{
	bigint res;
	for(int i=0;i<maxn;i++) res.a[i]=a.a[i]+b.a[i];
	for(int i=0;i<maxn-1;i++) res.a[i+1]+=(res.a[i]/mod),res.a[i]%=mod;
	return res;
}
bigint operator -(bigint a,bigint b)
{
	bigint res;
	if(a==b||a<b) return res;
	for(int i=0;i<maxn;i++) res.a[i]=a.a[i]-b.a[i];
	for(int i=0;i<maxn-1;i++)
	{
		if(res.a[i]<0) {res.a[i]+=mod;res.a[i+1]--;}
	}
	return res;
}
bigint operator *(bigint a,bigint b)
{
	bigint res;
	int i,j;
	for(i=0;i<maxn/2;i++) for(j=0;j<maxn/2;j++) res.a[i+j]+=(a.a[i]*b.a[j]);
	for(i=0;i<maxn-1;i++) res.a[i+1]+=(res.a[i]/mod),res.a[i]%=mod;
	return res;
}
bigint c2(bigint a)
{
	for(int i=maxn-1;i>=0;i--) {if(i&&a.a[i]%2) {a.a[i-1]+=mod;}a.a[i]/=2;}
	return a;
}
ll zh(bigint a)
{
	ll te=0;
	for(int i=maxn-1;i>=0;i--) te=te*mod+a.a[i];
	return te;
}
void print(bigint a)
{
	int i,j;
	for(i=maxn-1;i>=0;i--) if(a.a[i]||!i) {printf("%lld",a.a[i]);break;}
	for(--i;i>=0;i--) printf("%07lld",a.a[i]);
	printf("\n");
}

void Sqrt(bigint a,ll &r1,ll &r2)
{
	if(a==bigint(0)) {r1=r2=0;return;}
	bigint at(0),bt(100000000),tt,ss;
	bt=bt*bt*bigint(100);
	while(bigint(1)<bt-at)
	{
		tt=c2(at+bt);ss=tt*tt;
		if(ss==a) {r1=zh(tt);r2=r1;return;}
		if(ss<a) at=tt;
		else bt=tt;
	}
	r1=zh(at);r2=r1+1;
}

void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
	if(!b) {d=a;x=1;y=0;}
	else {gcd(b,a%b,d,y,x);y-=(a/b)*x;}
}

ll tabs(ll a) {return a>0?a:-a;}

ll mo(ll x, ll y, ll mo){
    ll sgn=(x<0?-1:(x>0))*(y<0?-1:(y>0));
    x=tabs(x);y=tabs(y);
    if(!sgn) return 0;
    ll n=mo;
    ll T=floorl(sqrtl(n)+0.5);
    ll t=T*T-n;
    ll a=x/T, b=x%T;
    ll c=y/T, d=y%T;
    ll e=a*c/T, f=a*c%T;
    ll v=((a*d+b*c)%n+e*t)%n;
    ll g=v/T, h=v%T;
    ll ret=(((f+g)*t%n + b*d)%n+h*T)%n;
    ret=(ret%n+n)%n;
    return ret*sgn;
}

ll xt[5][2],r,s;
ll x,y;

ll sqz(ll a,ll b)
{
	if(a>0) return (a+b-1)/b;
	if(a==0) return 0;
	return -((-a)/b);
}
ll xqz(ll a,ll b)
{
	if(a>0) return a/b;
	if(a==0) return 0;
	return -(-a+b-1)/b;
}

ll cal(ll A,ll B,ll C)
{
	//cout<<C<<" "<<-(A*y-B*x)<<endl;
	ll t1=A*A+B*B;
	ll fm=mo(C,-A*y+B*x,t1);
	C=tabs(C);
	ll tt1,tt2;
	if(bigint(t1)*bigint(r*r)<bigint(C)*bigint(C)) return 0;
	//print(bigint(t1)*bigint(r*r)-bigint(C)*bigint(C));
	Sqrt(bigint(t1)*bigint(r*r)-bigint(C)*bigint(C),tt1,tt2);
	ll kst=sqz(fm-tt1,t1),ken=xqz(fm+tt1,t1);
	//cout<<fm<<" "<<t1<<" "<<kst<<" "<<ken<<endl;
	return kst>ken?0:ken-kst+1;
}



int main()
{
	ll T;
	scanf("%lld",&T); 
	while(T--)
	{
		int i,j;
		scanf("%lld",&s);
		for(i=0;i<3;i++)
		{
			scanf("%lld %lld",&xt[i][0],&xt[i][1]);
			if(!i) scanf("%lld",&r);
		}
		for(i=1;i<3;i++) for(j=0;j<2;j++) xt[i][j]=xt[i][j]-xt[0][j];
		ll A=xt[2][1]-xt[1][1],B=xt[1][0]-xt[2][0],C=ll(xt[2][0])*xt[1][1]-ll(xt[1][0])*xt[2][1];
		if(A==0&&B==0){printf("0\n");continue;}
		ll d;
		gcd(tabs(A),tabs(B),d,x,y);
		if(s%d) {printf("0\n");continue;}
		if(A<0) x=-x;
		if(B<0) y=-y;
		A/=d;B/=d;C/=d;s/=d;
		ll res=cal(A,B,C+s)+cal(A,B,C-s);
		printf("%lld\n",res);
	}
	return 0;
}


产业园区在推动科技成果转化过程中,如何实现企业与高校的精准对接?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

项目实战:用西门子S7协议开发基于PLC的上位机.pdf

项目实战:用西门子S7协议开发基于PLC的上位机.pdf

ZOJ 3825 Garden and Sprinklers 扩展欧几里得

Garden and Sprinklers Time Limit: 2 Seconds      Memory Limit: 65536 KB There is a beautiful garden in Marjar University. Recently, Edward, the headmaster of Marjar University, decided to build

We Can 1197

产业园区如何高效挖掘企业技术需求并促进精准匹配?.docx

产业园区如何高效挖掘企业技术需求并促进精准匹配?

【JZOJ100046】收集卡片【模拟】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/100046 题目图片: http://wx3.sinaimg.cn/mw690/0060lm7Tly1fy7ghcpx5gj30j50fc0t4.jpg http://wx4.sinaimg.cn/mw690/0060lm7Tly1fy7ghcpmnaj30j605dt8m.jpg 给出一个长nnn的字符...

stoorz 636

国央企创新负责人如何降低科技成果转化服务成本并提升资源配置效率?.docx

国央企创新负责人如何降低科技成果转化服务成本并提升资源配置效率?

数字政府政务数据治理服务平台方案.pptx

数字政府政务数据治理服务平台方案.pptx

产业园区运营负责人如何精准匹配产业需求与科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

建筑工程业AI知识库平台规划方案(决策评审版)终稿.pptx

建筑工程业AI知识库平台规划方案(决策评审版)终稿.pptx

单相PWM整流器基于直流电流控制+虚拟dq两种闭环控制仿真【2个仿真+参考资料】

内容概要:本文介绍了单相PWM整流器的两种闭环控制策略仿真研究,即基于直流电流控制和虚拟dq变换的闭环控制方法。资源包含两个独立的Simulink仿真模型及相关参考资料,旨在对比和分析两种控制策略在动态响应、稳态精度及抗干扰能力等方面的性能差异。通过构建完整的主电路、控制回路与信号处理模块,展示了如何实现单位功率因数运行、直流侧电压稳定控制以及交流侧电流正弦化等关键目标,适用于电力电子变换器控制系统的学习与科研验证。; 适合人群:电气工程、自动化及相关专业的研究生、科研人员以及从事电力电子与新能源系统开发的工程师,具备一定的电路理论、自动控制原理和Simulink仿真基础者更佳。; 使用场景及目标:①深入理解单相PWM整流器的工作原理及其闭环控制机制;②掌握直流电流控制与虚拟dq控制两种方法的设计思路与实现步骤;③为相关课题的仿真建模、算法优化与论文写作提供参考依据和技术支持; 阅读建议:建议结合仿真模型与参考资料同步学习,重点分析控制器参数整定过程、坐标变换环节的实现方式,并尝试修改负载条件或输入扰动以测试系统鲁棒性,从而加深对控制策略本质的理解。

科技中介服务机构如何降低服务成本并提升服务响应速度?.docx

科技中介服务机构如何降低服务成本并提升服务响应速度?

科技中介服务机构如何利用智能工具提升技术需求挖掘与分析效率?.docx

科技中介服务机构如何利用智能工具提升技术需求挖掘与分析效率?

三电平Buck直流变换器双闭环、单闭环、开环仿真【附参考文献】(Simulink仿真实现)

内容概要:本文详细介绍了一套针对三电平Buck直流变换器的Simulink仿真资源,全面涵盖了开环、单闭环及双闭环控制策略的建模与仿真过程,并提供了配套参考文献以增强学术支撑。通过该仿真平台,用户能够深入理解不同控制方式对变换器输出稳定性、动态响应速度以及抗干扰能力的影响机制,尤其适用于高效率、低纹波直流电源系统的设计与性能优化研究。文档还列举了多种相关电力电子变换器的仿真案例,如三相交错并联Buck、双向Buck-Boost、LLC谐振变换器等,充分展现了电力电子系统在拓扑结构和控制技术方面的多样性与先进性,为科研与工程实践提供丰富的技术参考。; 适合人群:电气工程、自动化、电力电子及相关专业的本科生、研究生,以及从事电力变换系统研发的工程技术人员。; 使用场景及目标:① 掌握Buck类变换器的工作原理及其典型控制策略的设计方法;② 开展电力电子系统的建模与仿真实验,优化控制器参数;③ 支持课程设计、毕业设计或科研项目中的系统验证环节;④ 借助提供的仿真模板与文献资料快速搭建实验环境,提升科研效率与创新能力。; 阅读建议:建议读者结合MATLAB/Simulink环境动手实践,按照文档逐步构建仿真模型,重点剖析双闭环控制系统中电压环与电流环之间的耦合关系与协调机制,同时可拓展学习文中提及的其他变换器拓扑与先进控制方法,构建完整的电力电子系统控制知识体系。

科技中介服务机构在提供成果转化服务时,如何提升服务的专业性与客户粘性?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

二维导航网格算法可视化

二维导航网格算法可视化

医疗卫生业AI知识库数据处理及大模型训练平台规划设计方案.pptx

医疗卫生业AI知识库数据处理及大模型训练平台规划设计方案.pptx

该数据集收录了国内主要期货商品和股指指数的日频行情 商品期货覆盖有色、黑色、能化、农产品等板块,包含铜、螺纹钢、原油、豆粕等活跃合约 股指指数部分涵盖沪深300、上证50、中证500等品种 每个品种提

该数据集收录了国内主要期货商品和股指指数的日频行情。商品期货覆盖有色、黑色、能化、农产品等板块,包含铜、螺纹钢、原油、豆粕等活跃合约。股指指数部分涵盖沪深300、上证50、中证500等品种。每个品种提供统一字段:合约代码、交易日期、开盘价、最高价、最低价、收盘价、结算价、成交量和持仓量。数据按交易日顺次排列,未做复权处理,直接反映交易所原始发布信息。 数据源:CMES金融数据库

新版课件清华大学机器学习课件-012 第十二讲 条件随机场.pdf

新版课件清华大学机器学习课件-012 第十二讲 条件随机场

KernelSU.zip

KernelSU.zip

上一篇: SOJ11350
下一篇: SOJ1004
sysuyudx
博客等级 码龄12年 0粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值