搜尋(四分樹):BZOJ 4513 [SDOI2016 Round1] 儲能表

來源:互聯網
上載者:User

標籤:

4513: [Sdoi2016]儲能表Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 395  Solved: 213
[Submit][Status][Discuss]Description

有一個 n 行 m 列的表格,行從 0 到 n−1 編號,列從 0 到 m−1 編號。每個格子都儲存著能量。最初,第 i 行第 j 列的格子儲存著 (i xor j) 點能量。所以,整個表格儲存的總能量是,

隨著時間的推移,格子中的能量會漸漸減少。一個時間單位,每個格子中的能量都會減少 1。顯然,一個格子的能量減少到 0 之後就不會再減少了。也就是說,k 個時間單位後,整個表格儲存的總能量是,給出一個表格,求 k 個時間單位後它儲存的總能量。由於總能量可能較大,輸出時對 p 模數。Input

第一行一個整數 T,表示資料群組數。接下來 T 行,每行四個整數 n、m、k、p。

Output

 共 T 行,每行一個數,表示總能量對 p 模數後的結果

Sample Input3
2 2 0 100
3 3 0 100
3 3 1 100Sample Output2
12
6HINT

 T=5000,n≤10^18,m≤10^18,k≤10^18,p≤10^9

 

  找規律的方法過的。

  思路在程式中很清楚,用四分樹搜尋。

 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 typedef long long LL; 6  7 LL n,m,k,mod,len; 8 LL Max(LL a,LL b){ 9     return a>b?a:b;10 }11 12 LL Mul(LL a,LL b){13     LL ret=0;14     a%=mod;b%=mod;15     while(a){16         if(a&1)ret=(ret+b)%mod;17         a>>=1;b<<=1;18     }19     return ret;20 }21 22 LL Calc1(LL h,LL tot){23     LL t=h+tot-1,ret=0;24     h=Max(1,h-k);t-=k;25     if(h>t)return 0;26     if((h+t)&1) ret=Mul(Mul((h+t),(t-h+1)/2),tot);27     else ret=Mul(Mul((t-h+1),((h+t)/2)),tot);28     return ret;29 }30 31 LL Calc2(LL h,LL t,LL lb){32     LL ret=0;33     h=Max(1ll,h-k);t-=k;34     if(h>t)return 0;35     if((h+t)&1) ret=Mul(Mul((h+t),(t-h+1)/2),lb);36     else ret=Mul(Mul((t-h+1),((h+t)/2)),lb);37     return ret;38 }39 40 LL Solve(LL qa,LL qb,LL x1,LL y1,LL x2,LL y2,LL l){41     if(x1<y1){swap(qa,qb);swap(x1,y1);swap(x2,y2);}    42     if(qa>=x2&&qb>=y2){return Calc1(x1^y1,l);}43     else if(qa>=x2){return Calc2(x1^y1,(x1^y1)+l-1,qb-y1);}44     else if(qb>=y2){return Calc2(x1^y1,(x1^y1)+l-1,qa-x1);}45     LL mx=(x1+x2)>>1,my=(y1+y2)>>1,ret=0;46     if(x1<qa&&y1<qb)ret=(ret+Solve(qa,qb,x1,y1,mx,my,l>>1))%mod;47     if(mx<qa&&y1<qb)ret=(ret+Solve(qa,qb,mx,y1,x2,my,l>>1))%mod;48     if(x1<qa&&my<qb)ret=(ret+Solve(qa,qb,x1,my,mx,y2,l>>1))%mod;49     if(mx<qa&&my<qb)ret=(ret+Solve(qa,qb,mx,my,x2,y2,l>>1))%mod;    50     return ret;51 }52 int main(){53     int T;54     scanf("%d",&T);55     while(T--){56         scanf("%lld%lld%lld%lld",&n,&m,&k,&mod);57         if(n<m)swap(n,m);len=1;58         while(len<n)len<<=1;59         printf("%lld\n",Solve(n,m,0,0,len,len,len));60     }61     return 0;    62 }

 

搜尋(四分樹):BZOJ 4513 [SDOI2016 Round1] 儲能表

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.