HT-018 Div3 构造 题解 [ 黄 ] [ 数学 ] [ 结论 ]

构造:结论题,gcy数竞大佬tql%%%orz。

结论

先放结论:如果 xmod4=2 ,那么 x 无法被表示为 a2b2 的形式;除此之外的其他数都可以。

证明

a2b2 因式分解,得 x=(a+b)(ab)

xmod2=1

包含 xmod4=1xmod4=3 的情况。

尝试构造 :

{x+y=nxy=1

解得:

{x=n+12y=n12

因为 x 为奇数,所以 x,y 皆为整数,成立。

xmod4=0

4 提出来:

x=4t=(x+y)(xy)

所以设 x+y=2m,xy=2km,k 皆为整数 。

则解得

{x=m+ky=mk

显然 x,y 为整数,成立。

xmod4=2

2 提出来:

x=2t=(x+y)(xy)

所以设 x+y=2m,xy=km,k 皆为奇数 。因为 2m 已经是偶数了,如果 k 还是偶数,那么就 xmod4=0,与题设矛盾,不成立 。

则解得

{x=2m+k2=m+k2y=2mk2=mk2

显然 x,y 为不是整数,不成立。

因此得证。

代码细节

注意 l,r 都是负数时加特判,把他变成正数的情况。

因为 c++ 在对负数取模时,会先把负数去掉,把他当成正数后取模,最后再加上负号。和我们先模在加再模的方式不同。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
ll t,l,r;
int main()
{
	freopen("construct.in","r",stdin);
	freopen("construct.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>l>>r;
		ll rg=r-l+1;
		if(r<0)
		{
			l*=-1;
			r*=-1;
			swap(l,r);
		}
		if(r%4==0)r-=2;
		else if(r%4==1)r-=3;
		else if(r%4==3)r-=1;
		cout<<rg-ll(ceil((r-l+1)/4.0))<<endl;
	}
	return 0;
}
posted @   KS_Fszha  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
点击右上角即可分享
微信分享提示