zoukankan      html  css  js  c++  java
  • bzoj 3329: Xorequ

    Description

    题面

    Solution

    移项: (X) (xor) (2X=3X)
    因为 (X+2X=3X), 所以 (X)(2X) 相同位置不能同时为(1),也就是说 (X) 的相邻两位不能同为(1)
    数位DP解决即可,设 (f[i][0/1][0/1]) 表示前 (i) 位,该位是 (0/1) ,是否处于危险态的方案数

    对于第二问:
    由于 (n) 的二进制只有一位,所以上述DP不再需要记危险态这一维
    用矩阵快速幂优化转移即可,但是据说答案也可以是斐波那契数列,这样写不是更舒服么....

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    ll f[105][2][2],n;
    inline void add(ll &x,ll y){x+=y;}
    void solo(){
    	memset(f,0,sizeof(f));
    	int lim=0;
    	for(int i=0;i<=60;i++)if((n>>i)&1)lim=i;
    	f[lim][1][0]=1;f[lim][0][1]=1;
    	for(int i=lim;i>=1;i--){
    		for(int j=0;j<2;j++)
    			add(f[i-1][j][1],f[i][1][1]*(j!=1)+f[i][0][1]);
    		for(int j=0;j<=((n>>(i-1))&1);j++){
    			bool t=j<((n>>(i-1))&1);
    			add(f[i-1][j][t],f[i][1][0]*(j!=1)+f[i][0][0]);
    		}
    	}
    	ll ans=0;
    	for(int i=0;i<2;i++)
    		for(int j=0;j<2;j++)
    			add(ans,f[0][i][j]);
    	printf("%lld
    ",ans-1);
    }
    struct mat{
    	int a[3][3];
    	mat(){memset(a,0,sizeof(a));}
    	mat operator *(const mat &p)const{
    		mat ret;
    		for(int i=1;i<=2;i++)
    			for(int j=1;j<=2;j++)
    				for(int k=1;k<=2;k++)
    					ret.a[i][j]=(ret.a[i][j]+1ll*a[i][k]*p.a[k][j]%mod)%mod;
    		return ret;
    	}
    };
    void solve(ll k){
    	if(k==-1){puts("2");return ;}
    	mat A,B;
    	A.a[1][1]=3;A.a[1][2]=2;
    	B.a[1][1]=B.a[1][2]=B.a[2][1]=1;
    	while(k){
    		if(k&1)A=A*B;
    		B=B*B;k>>=1;
    	}
    	printf("%d
    ",A.a[1][1]);
    }
    void work(){
    	scanf("%lld",&n);
    	solo();solve(n-2);
    }
    int main(){
      freopen("pp.in","r",stdin);
      freopen("pp.out","w",stdout);
      int T;cin>>T;
      while(T--)work();
      return 0;
    }
    
    
  • 相关阅读:
    Exercise02_09
    Exercise02_05
    Exercise02_01
    Exercise02_03
    Exercise02_07
    web.xml配置详解
    面对不成功的人生
    请不以结婚为目的的恋爱吧
    年轻人能为世界做点什么
    不作就不会活
  • 原文地址:https://www.cnblogs.com/Yuzao/p/8455953.html
Copyright © 2011-2022 走看看