BZOJ 4589: Hard Nim DP+快速幂+FWT

朴素的DP:$f[i][j]$ 表示选了 $i$ 个数,异或值为 $j$ 的方案数.

转移:$f[i][j]=\sum_{i=1}^{m}f[i-1][k]\times isprime[p]$($p$ 异或 $k$ 等于 $j$)

如果 $n$ 比较小的话可以直接进行 FWT 优化 DP.

然而,这道题中 $n=10^9$,那就用快速幂优化 DP 就好啦 ~

 code:

#include  
#include        
#define ll long long  
#define N 100002 
#define MAXM 50000
#define mod 1000000007 
#define setIO(s) freopen(s".in","r",stdin) // ,freopen(s".out","w",stdout)  
using namespace std;                   
int lim,inv,tot; 
int ar[N],br[N],prime[MAXM],vis[MAXM];     
int qpow(int x,int y) 
{
    int tmp=1; 
    for(;y;y>>=1,x=(ll)x*x%mod) 
        if(y&1) tmp=(ll)tmp*x%mod;  
    return tmp; 
}
void FWT(int *f,int opt) 
{            
    int i,j,k;    
    for(i=1;i>=1; 
        for(int i=0;i 
 

  

你可能感兴趣的:(BZOJ 4589: Hard Nim DP+快速幂+FWT)