noip 模拟赛 T3

问:如何快速求出等差数列异或和?

玄学题...

对于异或运算,我们可以分开考虑每一位是1还是0,这样会好做一些

于是我们发现,每一位是一还是0的判别式如下:

设读入的数为x,y,z,等差数列共n项

第i位的值=∑[x+kz/2^i]mod 2 ,k∈[0,n-1]

然后怎么求?

令x=b,k=x,z=a,2^i=c于是

原式=∑[(ax+b)/c]mod 2 ,x∈[0,n-1]

这样:

原式=[a/c]n(n-1)/2+[b/c]n+∑[((a%c)x+b%c)/c] mod 2

前两项可以O(1)求,我们关注一下第三项

我们构造一条直线y=(a%c)/c x+(b%c)/c

那么所求的答案就是直线下方在(0,n-1]内整点的个数

于是我们重构一下坐标系:

令x=n,求出y=[(a%c)/c x+(b%c)/c],以(x,y)为原点,原x轴负方向为y轴正方向,原y轴负方向为x轴正方向建立新坐标系

那么我们会发现,所求的答案范围并没有变,仍然是刚才说的那些点的范围,但是我们可以换一个方式来求:

重构坐标系以后,每个点的横纵坐标交换,所以新的直线斜率是原来的倒数,即c/(a%c)

于是我们只需求出新的截距就能确定新的这条直线

以下是求截距的方程:

如果想求出截距,我们需要解出原坐标系中y=[(a%c)/c n+(b%c)/c]时在直线y=(a%c)/c x+(b%c)/c上对应的x值

所以我们要求解方程[(a%c)/c n(b%c)/c]=(a%c)/c x+(b%c)/c

最后解出x=n-(an+b)%c

这样截距就是n-x=(an+b)%c/(a%c)

这样新直线也就定下来了

那么我们所求也就转成了:

∑((cx+(an+b))/(a%c)),x∈[0,[((a%c)/c)n+(b%c)/c]-1]

发现这个表达式与原表达式结构相同,于是我们递归求解即可

注意上面的[x]为高斯函数,含义为向下取整

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
ll xx,y,z;
ll get_ans(ll a,ll x,ll b,ll c)
{
    ll ret=0;
    ret+=x*(b/c)%2+(x-1)*x/2*(a/c)%2;    
    a%=c;
    b%=c;
    if(a*x+b<c)
    {
        return ret%2;
    }else
    {
        return (ret%2+get_ans(c,(a*x+b)/c,(a*x+b)%c,a))%2;
    }
}
int main()
{
    freopen("C.in","r",stdin);
    freopen("C.out","w",stdout);
    scanf("%I64d%I64d%I64d",&xx,&y,&z);
    ll n=(y-xx)/z+1;
    ll ans=0;
    for(int i=0;i<32;i++)
    {
        ans|=((get_ans(z,n,xx,(1ll<<i))%2)<<i);
    }
    printf("%I64d\n",ans);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NOI(全国青少年信息学奥林匹克竞模拟的测试数据是指用于评测参选手的程序的输入和对应的输出。测试数据是非常重要的,因为它决定了参选手的程序能否正确地解决问题。 在NOI模拟中,测试数据具有以下特点: 1.充分覆盖:测试数据应涵盖各种可能的输入情况,包括边界条件和极端情况。通过提供不同的测试数据,可以考察选手对问题的全面理解和解决能力。 2.随机性和均衡性:为了公平起见,测试数据应该是随机生成的,而不是针对某个特定算法或解法设计的。同时,测试数据应该是均衡的,即各种情况的概率应该大致相等,以避免偏向某些解法。 3.合理性和可行性:测试数据应该是合理和可行的,即符合题目要求的输入数据,并且是选手能够通过编写程序来处理的。测试数据应该考虑到程序的限制和时间复杂度,以充分测试选手的编程能力。 NOI模拟的测试数据通常由经验丰富的考题组负责生成。他们会根据题目的要求和限制,设计出一组合理、充分、随机和均衡的测试数据,以确保参选手的程序在各种情况下都能正确运行,并且能通过性能测试。 总之,测试数据在NOI模拟中起到了至关重要的作用,它既考察了选手对问题的理解和解决能力,又提高了选手编程的技巧和效率。同时,合理和恰当的测试数据也是公平竞的保证,确保每个参选手有相同的机会和条件进行竞争。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值