【bzoj4589】Hard Nim FWT+快速幂

题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$。其中,$n≤10^9,m≤10^5$。

 

考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$j$的方案数。

我们构造一个数组$g$,若i为不大于$m$的质数,则$g[i]=1$,否则为$0$。

那么显然,$f[i][j]=\sum f[i-1][k]\times g[j \oplus k]$。  其中$j \oplus k$表示$j$和$k$的按位异或。

然后我们不难发现,$f[i]为f[i-1]$与$g$的异或卷积。

则$f[n]$为$g$的$n$次异或卷积,答案显然为$f[n][0]$。

我们用$FWT$将$g$变成点值表达式,然后做快速幂,最后再插值回来,就得到答案了。

时间复杂度为$O(m\ log\ m+m\ log\ n)$。

 

 

 1 #include<bits/stdc++.h>
 2 #define M 131072
 3 #define L long long
 4 #define MOD 1000000007
 5 using namespace std;
 6 int b[M]={0},pri[M]={0},use=0;
 7 void init(){
 8     for(int i=2;i<M;i++){
 9         if(!b[i]) pri[++use]=i;
10         for(int j=1;j<=use&&i*pri[j]<M;j++){
11             b[i*pri[j]]=1;
12             if(i%pri[j]==0) break;
13         }
14     }
15 }
16 L pow_mod(L x,int k){
17     L ans=1;
18     while(k){
19         if(k&1) ans=ans*x%MOD;
20         x=x*x%MOD; k>>=1;
21     }
22     return ans;
23 }
24 void FWT(L a[],int n,int on){
25     for(int i=1;i<n;i<<=1)
26     for(int j=0;j<n;j++)
27     if(i&j){
28         L w=a[i^j];
29         a[i^j]=(w+a[j])%MOD;
30         a[j]=(w-a[j]+MOD)%MOD;
31     }
32     if(on==-1){
33         L inv=pow_mod(n,MOD-2);
34         for(int i=0;i<n;i++) a[i]=a[i]*inv%MOD;
35     }
36 }
37 L g[M]={0},ans[M]={0};
38 int main(){
39     init();
40     int t,n;
41     while(cin>>t>>n){
42         int len=1; while(len<=n) len<<=1;
43         for(int i=2;i<=n;i++) if(b[i]==0) g[i]=1;
44         FWT(g,len,1); memcpy(ans,g,M<<3); t--;
45         while(t){
46             if(t&1) for(int i=0;i<len;i++) ans[i]=ans[i]*g[i]%MOD;
47             t>>=1; for(int i=0;i<len;i++) g[i]=g[i]*g[i]%MOD;
48         }
49         FWT(ans,len,-1);
50         printf("%lld\n",ans[0]);
51         memset(g,0,len<<3); memset(ans,0,len<<3);
52     }
53 }

 

 

 

 

转载于:https://www.cnblogs.com/xiefengze1/p/9241827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值