zoukankan      html  css  js  c++  java
  • [SDOI2016]储能表

    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 Input

    3
    2 2 0 100
    3 3 0 100
    3 3 1 100

    Sample Output

    2
    12
    6

    HINT

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

    令$f[i][a][b][c]和g[i][a][b][c]$表示第i位,表示x后i-1位是否等于n,y后i-1位是否等于m,x^y后i-1位是否等于k的异或和以及方案数

    如果a==1,且第i位大于n的第i位,那么超过上界,舍去

    b同理

    c比较特殊,如果c==1,如果第i为小于k的第i位,那么异或结果必定小于k,答案为0,舍去

    $g[i][a][b][c]+=g[i-1][aa][bb][cc]$

    $f[i][a][b][c]+=f[i-1][aa][bb][cc]+[第i位异或值为1]*2^{i}*g[i-1][aa][bb][cc]$

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 typedef long long lol;
     8 lol f[81][2][2][2],g[81][2][2][2],n,m,Mod,k,pw[61],t1,t2,S,t3;
     9 void dfs(lol x,int a,int b,int c)
    10 {lol i,j;
    11   if (f[x][a][b][c]!=-1||g[x][a][b][c]!=-1) return;
    12   g[x][a][b][c]=f[x][a][b][c]=0;
    13   if (x==0)
    14     {
    15       f[0][a][b][c]=0;
    16       g[0][a][b][c]=1;
    17       return;
    18     }
    19   for (i=0;i<=1;i++)
    20     {
    21       int xx=(n>>x-1)&1;
    22       int yy=(m>>x-1)&1;
    23       int zz=(k>>x-1)&1;
    24       if (a&&i>xx) continue;
    25       for (j=0;j<=1;j++)
    26     {
    27       if (b&&j>yy) continue;
    28       lol p=i^j;
    29       if (c&&p<zz) continue;
    30       int aa=a&(xx==i);
    31       int bb=b&(yy==j);
    32       int cc=c&(zz==p);
    33       dfs(x-1,aa,bb,cc);
    34       g[x][a][b][c]=(g[x][a][b][c]+g[x-1][aa][bb][cc])%Mod;
    35       f[x][a][b][c]=((f[x][a][b][c]+g[x-1][aa][bb][cc]*p*(pw[x-1]%Mod)%Mod)%Mod+f[x-1][aa][bb][cc])%Mod;
    36     }
    37     }
    38 }
    39 lol solve()
    40 {
    41   memset(f,-1,sizeof(f));
    42   memset(g,-1,sizeof(g));
    43   t1=0;S=n;
    44   if (n==0&&m==0) return 0;
    45   while (S)
    46     {
    47       S>>=1;
    48       t1++;
    49     }
    50   t2=0;S=m;
    51   while (S)
    52     {
    53       S>>=1;
    54       t2++;
    55     }
    56   t3=0;S=k;
    57   while (S)
    58     {
    59       S>>=1;
    60       t3++;
    61     }
    62   t1=max(t1,max(t2,t3));
    63   dfs(t1,1,1,1);
    64   return f[t1][1][1][1]-(k%Mod)*g[t1][1][1][1]%Mod;
    65 }
    66 int main()
    67 {int T,i;
    68   cin>>T;
    69   pw[0]=1;
    70   for (i=1;i<=60;i++)
    71     pw[i]=pw[i-1]*2;
    72   while (T--)
    73     {
    74       cin>>n>>m>>k>>Mod;
    75       n--;m--;
    76       printf("%lld
    ",(solve()+Mod)%Mod);
    77     }
    78 }
  • 相关阅读:
    Xcode7 真机调试步骤以及遇到的问题解决办法
    AndroidStudio .gitinore编写
    Android Studio Jar、so、library项目依赖
    Android studio导入eclipse项目混淆打包出错
    spring中ref属性与<ref/>标签
    NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.servlet.view.InternalResourceViewResolver' available
    Maven学习笔记
    Tomcat日志与Log4j日志
    Git笔记
    Tomcat学习
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8577883.html
Copyright © 2011-2022 走看看