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;
    }
  • 相关阅读:
    SpringCloud-Hystrix Dashboard 之 Unable to connect to Command Metric Stream
    try() catch{}
    git使用和操作
    外部服务器使用jedis操作redis数据库
    Tomcat部署spring boot项目
    java成神之路截图
    innodb 死锁分析之相关表结构说明
    mysql 死锁案例及分析过程
    Head First设计模式之观察者(Observer)模式(二)
    Head First设计模式之策略模式(Strategy)
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7672397.html
Copyright © 2011-2022 走看看