B - Odd Grasshopper(奇怪的蚱蜢)

 

 

InputcopyOutputcopy
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

最后贴个好帖给自己留个方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值