链接:
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