【HDU5909】Tree Cutting FWT

本文探讨了一种利用动态规划(DP)解决子树异或问题的方法,并通过快速沃尔什-赫达曼变换(FWT)进行优化,以提高多项式相乘的效率。在遍历树结构的过程中,通过维护每个节点的子树中所有可能的异或值及其出现次数,最终求得整棵树的所有连通块异或值的方案数。

令 $f[x][j]$ 表示以 $x$ 为根的子树,选出连通块的异或值为 $j$ 的方案数.

然后有 $f[x][j]=f[x][j]+\sum_{i\oplus k=j} f[x][i] \times f[son][k]$.

其中,$\oplus$ 为异或符号.

求解这个东西显然可以用 $FWT$ 来加速.

有两种方式,第一个是当遍历 $x$ 的儿子的时候分别于每一个儿子都做一次 $FWT$,但是这个会比较慢.

一个更好的方式是我们知道若干个多项式相乘不必一一相乘,而是统一进行 $FWT$,然后最后做一次 $IFWT$ 就行.

但是这里有一个地方需要注意:$f[x][0]$ 必须要 +1,因为当 $x$ 的父亲与 $x$ 结合时有可能不选 $x$.     

#include <cstdio> 
#include <cstring> 
#include <string>   
#include <vector>  
#include <cctype>   
#include <algorithm>  
#define N 1306  
#define RG register
#define ll long long 
#define mod 1000000007 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;    
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}  
int lim,inv,n;      
int f[N][N],ans[N];    
vector<int>G[N];   
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 *a,int opt) 
{
    int i,j,k;  
    for(i=1;i<lim;i<<=1) 
    {
        for(j=0;j<lim;j+=i<<1) 
        {
            for(k=0;k<i;++k) 
            {
                int tmp=a[j+k];   
                a[j+k]=(ll)(a[j+k]+a[j+k+i])%mod;       
                a[j+k+i]=(ll)(tmp-a[j+k+i]+mod)%mod;     
                if(opt==-1) 
                {
                    a[j+k]=(ll)inv*a[j+k]%mod;   
                    a[j+k+i]=(ll)inv*a[j+k+i]%mod;   
                }   
            }
        }
    }
}
void dfs(int u,int ff) 
{
    FWT(f[u],1); 
    for(int i=0;i<G[u].size();++i) 
    {
        int y=G[u][i]; 
        if(y==ff) continue;   
        dfs(y,u);    
        for(int j=0;j<lim;++j) f[u][j]=(ll)f[u][j]*f[y][j]%mod;   
    }                   
    FWT(f[u],-1),f[u][0]=(f[u][0]+1)%mod,FWT(f[u],1);             
    G[u].clear();  
}
int main() 
{ 
    // setIO("input");  
    inv=qpow(2,mod-2);  
    int i,j,T;  
    T=read();  
    while(T--) 
    {  
        // scanf("%d%d",&n,&lim);     
        n=read(),lim=read(); 
        memset(f,0,sizeof(f)),memset(ans,0,sizeof(ans));   
        for(i=1;i<=n;++i) 
        {
            ++f[i][read()];   
        }
        for(i=1;i<n;++i) 
        {
            int x=read(),y=read();  
            G[x].push_back(y); 
            G[y].push_back(x);   
        }   
        dfs(1,0);  
        for(i=1;i<=n;++i)  FWT(f[i],-1);   
        for(i=1;i<=n;++i)  f[i][0]=(f[i][0]-1+mod)%mod;           
        for(i=1;i<=n;++i)  for(j=0;j<lim;++j) ans[j]=(ll)(ans[j]+f[i][j])%mod;   
        for(i=0;i<lim-1;++i) printf("%d ",ans[i]);   
        printf("%d\n",ans[lim-1]);    
    }
    return 0; 
}

  

Matlab基于粒子群优化算法及鲁棒MPPT控制器提高光伏并网的效率内容概要:本文围绕Matlab在电力系统优化与控制领域的应用展开,重点介绍了基于粒子群优化算法(PSO)和鲁棒MPPT控制器提升光伏并网效率的技术方案。通过Matlab代码实现,结合智能优化算法与先进控制策略,对光伏发电系统的最大功率点跟踪进行优化,有效提高了系统在不同光照条件下的能量转换效率和并网稳定性。同时,文档还涵盖了多种电力系统应用场景,如微电网调度、储能配置、鲁棒控制等,展示了Matlab在科研复现与工程仿真中的强大能力。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事新能源系统开发的工程师;尤其适合关注光伏并网技术、智能优化算法应用与MPPT控制策略研究的专业人士。; 使用场景及目标:①利用粒子群算法优化光伏系统MPPT控制器参数,提升动态响应速度与稳态精度;②研究鲁棒控制策略在光伏并网系统中的抗干扰能力;③复现已发表的高水平论文(如EI、SCI)中的仿真案例,支撑科研项目与学术写作。; 阅读建议:建议结合文中提供的Matlab代码与Simulink模型进行实践操作,重点关注算法实现细节与系统参数设置,同时参考链接中的完整资源下载以获取更多复现实例,加深对优化算法与控制系统设计的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值