zoukankan      html  css  js  c++  java
  • 【BZOJ4513】[Sdoi2016]储能表 数位DP

    【BZOJ4513】[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

    题解:神级数位DP。

    用f[x][0/1][0/1][0/1]表示前x位,当前i<n还是i=n,j<m还是j=m,i^j>k还是i^j=k 的(i,j)个数。

    g[x][0/1][0/1][0/1]表示这些数的和。

    转移过程我已无力描述,不过代码还是很可读的~

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    ll n,m,K,P;
    ll ans,cnt,sum;
    ll f[70][2][2][2],g[70][2][2][2];
    inline ll rd()
    {
    	ll ret=0;	char gc=getchar();
    	while(gc<'0'||gc>'9')	gc=getchar();
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret;
    }
    void work()
    {
    	n=rd(),m=rd(),K=rd(),P=rd();
    	int i,a,b,c,x,y,z,A,B,C;
    	ll ni,mi,ki;
    	memset(f,0,sizeof(f)),memset(g,0,sizeof(g));
    	f[61][1][1][1]=1;
    	for(i=60;i>=0;i--)	for(a=0;a<=1;a++)	for(b=0;b<=1;b++)	for(c=0;c<=1;c++)	if(f[i+1][a][b][c])
    	{
    		ni=(n>>i)&1,mi=(m>>i)&1,ki=(K>>i)&1;
    		for(x=0;x<=1;x++)	if(!a||x<=ni)	for(y=0;y<=1;y++)	if(!b||y<=mi)
    		{
    			z=x^y;
    			if(c&&z<ki)	continue;
    			A=a&&x==ni,B=b&&y==mi,C=c&&z==ki;
    			f[i][A][B][C]=(f[i][A][B][C]+f[i+1][a][b][c])%P;
    			g[i][A][B][C]=(g[i][A][B][C]+g[i+1][a][b][c])%P;
    			if(z)	g[i][A][B][C]=(g[i][A][B][C]+(1ll<<i)%P*f[i+1][a][b][c]%P)%P;
    		}
    	}
    	printf("%lld
    ",(g[0][0][0][0]-K%P*f[0][0][0][0]%P+P)%P);
    }
    int main()
    {
    	int T=rd();
    	while(T--)	work();
    	return 0;
    }
  • 相关阅读:
    关于Maya Viewport 2.0 API 开发的介绍视频
    春节大假
    Some tips about the life cycle of Maya thread pool
    Can I compile and run Dx11Shader for Maya 2015 on my side?
    How to get current deformed vertex positions in MoBu?
    想加入全球首届的 欧特克云加速计划吗?
    三本毕业(非科班),四次阿里巴巴面试,终拿 offer(大厂面经)
    mac、window版编辑器 webstorm 2016... 永久破解方法。
    node 搭载本地代理,处理web本地开发跨域问题
    js 一维数组,转成嵌套数组
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7672397.html
Copyright © 2011-2022 走看看