Inputcopy Outputcopy 9 0 1 0 2 10 10 10 99 177 13 10000000000 987654321 -433494437 87178291199 1 0 -1 1 -1 1 11 110 190 9012345679 -87611785637 1 0
考察数学+模拟,规律就是奇数起点和偶数起点计算不同,然后是周期性变化,注意10^14要开longlong,下面给出某饭的代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int n,x,i,count;cin>>n;//x:初始位置 i:移动次数
while(n--)
{
count=0;
cin>>x>>i;
count += x;
if(x%2==0)//初始坐标为偶数
{
if (i % 4 == 0) count += 0;
else if (i % 4 == 1) count -= i;
else if (i % 4 == 2) count += 1;
else if (i % 4 == 3) count += (i + 1);
}
else //初始坐标为奇数
{
if (i % 4 == 0) count += 0;
else if (i % 4 == 1) count += i;
else if (i % 4 == 2) count -= 1;
else if (i % 4 == 3) count -= (i + 1);
}
cout<<count<<endl;
}
return 0;
}
下面是我的代码:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=n;i>=n;i--)
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 0x3f3f3f3f;
int main()
{
ll t,x,n;
cin>>t;
while(t--)
{
cin>>x>>n;
rep(i,n/4*4+1,n)
{
if(abs(x)%2==0) x -= i;
else x += i;
}
cout<<x<<endl;
}
return 0;
}
思路就是假设有K个周期,周期是T,那么只需要从第K个周期开始计算,也就是计算从K-(K%T)+1到K的情况,题目中是K/T*T+1同样是此效果,为什么要加一,是因为周期函数F(x+K)=F(x),不加1其实也行。注意这里K-(K%T)和K/T*T都是向下取整,当然你也可以用floor函数(ceil函数是向上取整),代码中abs绝对值函数是我为了避免某些情况下负奇数求余出现的负的数,但题目只需要是或不是两种状态,而不是用到数值的状态,所以可以放心去掉食用。
*要注意区分向0取整与向上向下取整区别
*abs是对整型,fabs是对浮点型
*round函数 和 直接+0.5是四舍五入取整,强制转换可以实现向0取整
*如果要用到负数求余数值状态可以:(a % mod + mod) % mod