1603B - Moderate Modular Mode

链接:

https://codeforces.com/problemset/problem/1603/B

题意:

给你x和y,找一个n,满足n%x==y%n

解:

math题好难QWQ

首先x=y,肯定输出x就行

然后x>y,显而易见(x+y)%x=y=y%(x+y)

最后x<y,可得当n%x的值以及被确定在0到x-1之间

当n=x的时候,n%x==0,y%n=y%x的值,等于y减去小于等于y最大的x的倍数,即y-xx

这时候让n=x+j,会发现n%x==j,但是y%n和y%x的变量跟xx/x的值有关

所以让n=xx+j

这时候能发现假设j=1,n%x=1,而y%n和y%x的值差值为-1!(上面提到y%x=y-xx)

那么这时,只要让j==(y-xx)/2,就可以让n%x==(y-xx)/2,y%n==(y-xx)/2

那么吧y-xx替换成y%x,因为(y-xx)/2为xx和y的中点,那么xx+(y-xx)/2==y-(y-xx)/2

得到最终式子y-(y%x)/2

顺便贴一下官方题解图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kFx2IRR-1636030478671)(C:\Users\93794\Desktop\VC++\2020TKK小组\GWNT打卡\图片\2021114.png)]

PS:一开始暴力摁实,发现如果n=x+j的话,n%x和y%n的变化结果(abs)不是1:1变化的,但是只要找到小于等于y的最大的x的倍数xx

这时候,两者的变化(abs)就变成1:1,太神奇了,我真是纯纯的数学渣渣

实际代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
void find(int x,int y)//n%x==y%n;
{
	if(x==y) cout<<x<<endl;
	else 
	{
		if(x>y) cout<<x+y<<endl;
		else
		{
			int mao=y%x;
			cout<<y-mao/2<<endl; 
		}
	}
}
int main()
{
	int T;
	cin>>T;
	for(int f=1;f<=T;f++)
	{
		int x,y;
		cin>>x>>y;
		find(x,y);
	}
}

限制:

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

上一篇:THREEJS 第三十六用 单体发光官方加入THREE啦


下一篇:threejs 学习之射线的使用