noip 類比賽 T3

來源:互聯網
上載者:User

標籤:turn   快速   algo   範圍   怎麼   需求   異或運算   str   構造   

問:如何快速求出等差數列異或和?

玄學題...

對於異或運算,我們可以分開考慮每一位是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 longusing 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;}

 

noip 類比賽 T3

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.