bzoj1494: [NOI2007]生成树计数

BZOJ1494】【NOI2007生成树计数 【题目链接】 点击打开链接 【思路要点】 写个矩阵树定理的暴力,求出对于输入的kkk,NNN在100以内的结果。 运行BM算法,我们发现答案是一个至多46阶的线性递推。 然后求它的第NNN项就好了。 时间复杂度O(R4+R2LogN)O(R4+R2LogN)O(R^4+R^2LogN),其中R=46R=46R=46。 【代码】 ... 阅读详情

传送门
将k个点的连通性用最小表示法压成状态,那么最多有52种状态
最小表示法中,f[i]表示最小的与其联通的点编号。
计算出每个状态的生成树个数,作为初始行向量A
对于每种状态考虑新加入一个点并向这k个点连边,每种连法可以转移到哪些状态,得到转移矩阵B
那么答案就是A∗Bn[所有点都连通的状态]
就是代码炒鸡长。

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mo 65521
#define uint unsigned int
#define ll long long
using namespace std;
int k,tot,pos[33333];
ll n;
uint A[60],ans;
struct mat{
    uint a[60][60];
    mat(int fl){
        memset(a,0,sizeof(a));
        for (int i=1;i<=tot;i++)
            a[i][i]=fl;
    }
    uint* operator [](int x){
        return a[x];
    }
    friend mat& operator *=(mat &x,mat y){
        mat z(0);
        for (int i=1;i<=tot;i++)
            for (int j=1;j<=tot;j++)
                for (int k=1;k<=tot;k++)
                    z[i][j]=(z[i][j]+x[i][k]*y[k][j])%mo;
        return x=z; 
    }
}a(0);
mat power(mat x,ll y){
    mat s(1);
    for (;y;y/=2,x*=x)
        if (y&1) s*=x;
    return s;
}
void express(int a[],int x){
    for (int i=0;i<k;i++)
        a[i]=(x>>i*3)&7;
}
int impress(int a[]){
    int s=0;
    for (int i=0;i<k;i++)
        s|=a[i]<<i*3;
    return s;
}
void stdsize(int a[]){
    static int b[10];
    int cnt=0;
    memset(b,0,sizeof(b));
    for (int i=0;i<k;i++)
        if (!b[a[i]]) b[a[i]]=++cnt;
    for (int i=0;i<k;i++) a[i]=b[a[i]];
}
bool ok(int x){
    static int a[10];
    int now=1;
    express(a,x);
    for (int i=0;i<k;i++)
        if (!a[i]||a[i]>now) return 0;
        else if (a[i]==now) now++;
    return 1;
}
void calc1(int x){
    static int A[10],b[10],cnt[10];
    int lim=0;
    express(A,x);
    memset(cnt,0,sizeof(cnt));
    for (int i=0;i<k;i++){
        cnt[A[i]]++;
        lim=max(lim,A[i]);
    }
    for (int _x=0;_x<1<<lim;_x++){
        if (cnt[1]==1&&_x%2==0) continue;
        int tmp=1;
        memcpy(b,A,sizeof(A));
        b[k]=9;
        for (int i=1;i<=lim;i++)
            if (_x&(1<<i-1)) tmp*=cnt[i];
        for (int i=0;i<k;i++)
            if (_x&(1<<A[i]-1)) b[i]=9;
        stdsize(b+1);
        a[pos[x]][pos[impress(b+1)]]=tmp;
    }
}
int power(int x,int y){
    int s=1;
    for (;y>0;y--) s*=x;
    return s; 
}
void calc2(uint A[],int x){
    static int a[10],cnt[10];
    int s=1;
    express(a,x);
    memset(cnt,0,sizeof(cnt));
    for (int i=0;i<k;i++) cnt[a[i]]++;
    for (int i=1;cnt[i];i++)
        s*=power(cnt[i],cnt[i]-2);
    A[pos[x]]=s;
}
int main(){
    scanf("%d%lld",&k,&n);
    if (k>n) k=n;
    for (int i=0;i<1<<k*3;i++)
        if (ok(i)) pos[i]=++tot;
    for (int i=0;i<1<<k*3;i++)
        if (pos[i]){
            calc1(i);
            calc2(A,i);
        }
    mat B=power(a,n-k);
    for (int i=1;i<=tot;i++)
        ans=(ans+A[i]*B[i][1])%mo;
    printf("%u",ans);
}
RK3588与FocalTech触摸屏代码适配全解析:从原理到实战 摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。 阅读详情

相关推荐

【GEOS-Chem模拟教程第二期下】全球生物质燃烧 GFAS 数据配置

本博客详细介绍全球生物质燃烧 GFAS 数据下载及在 GEOS-CHEM 模型中的配置

WW、forever的博客 1374

最小生成树

prime模板 核心代码: for(j = 1; j    {     if(lowcost[j] != 0 && lowcost[j] > dis[choose] [j] )  //在这里第一条找到的边是6,那么此时的choose是2,这里的意思就是: //原点到某一点的距离大于被标记的这一点到其余一点的距离,即使说,原点到这些点都可以更新 //也就是相当于找到2后,然后再更新的

muxi@Achilles的专栏 825

IQOOU3Xpd2106解锁bl工具+root详细图文教程

IQOOU3X【pd2106】解锁bl工具+root详细图文教程1---资源内带详细的图文教程步骤2---资源内带相关解锁bl驱动与解锁工具3---按步骤操作即可解锁bl 然后按步骤获取面具root权限4---从此走向vivo机型玩机之路。安装框架 模块等等5----需要的友友建议看图文教程3遍后在操作6----建议备份重要资料后在操作。7----任何的刷写操作都有风险。友友们请谨慎操作

一本通->提高篇->图论-> 最小生成树

一本通: 提高篇: 图论: 最小生成树: 1486 【例题1】黑暗城堡 求最短路径生成树,用最短路算法求出最短路后,找到最后dis数组,遍历每条边上找到对应成立dis[]的度数(个数),再用乘法原理求出结果。 #include<bits/stdc++.h> using namespace std; typedef long long ll; //const ll mod = (1&lt...

A_Pathfinder的博客 1234

最小生成树计数

(1)定理 不同的最小生成树中,每种权值的边出现的个数是确定的。 如果AAA,BBB同为GGG的最小生成树,如果AAA,BBB都是从小到大加边,那么每种权值加完后图的联通性相同。 如果在最小生成树AAA中权值为vvv的边有kkk条,用任意kkk条权值为vvv的边替换AAA中的权为vvv的边且不产生环的方案都是一颗合法的最小生成树。 (2)算法 先用Kruskal算法记录每种权值在最小生成树中的出现次数,然后对于每种权值的边分别求出方案,利用乘法原理即可。 代码 struct build {

qq_40278296的博客 1207

图论之最小生成树计数(最小生成树的应用)

题目 2401: 信息学奥赛一本通T1492-最小生成树计数 时间限制: 2s内存限制: 192MB提交: 18 解决: 8 题目描述 原题来自:JSOI 2008 现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。 输入格式 第一行包含两个数,n 和 m,表示该无向图的节点数和边数,每个节点用 1∼n 的整数编号; 接下来的 m 行,每行包含两个整数:a

2301_80221401的博客 938

一本通1492:最小生成树计数

【代码】一本通1492:最小生成树计数

liu12345635的博客 492

BZOJ 1494: [NOI2007]生成树计数

这题确实比较难, 所以我写解题报告也尽量从浅显处着手,希望能够帮到大家。 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1494 题目大意:有n(n 算法: 从这道题的数据范围,不难看出要使用状态压缩。 首先,我们来确定前k个点的状态。

frog的小池塘 2667

bzoj 1494: [NOI2007]生成树计数

55555555555555555555555555555555被虐哭了 调了两个小时才调出来,简直不要太坑。 论文还是比较良心的,就是初始矩阵好难构造的说。 最后迫不得已写了个很挫的方法构造。 #include #include #include #include using namespace std; typedef long long ll; const int p=65521;

月下沙茶树 712

bzoj1494: [NOI2007]生成树计数 (状压+矩阵倍增)

bzoj1494: [NOI2007]生成树计数 题意 求使所有点连成一棵生成树的方案数 代码 #include &amp;lt;cstdio&amp;gt; #include &amp;lt;cstring&amp;gt; #include &amp;lt;cmath&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; #define M 65521

生活不易,多才多艺 384

BZOJ1494: [NOI2007]生成树计数(Berlekamp-Massey算法)

传送门 题解: 直接打表+BM算出递推式,BM具体实现可以戳这里 附上一份其丑无比的BM代码: const int L=4e2; namespace bm { int cnt,a[N],fail[N],delta[N]; vector &amp;amp;lt;int&amp;amp;gt; R[N]; inline void pt(vector &amp;amp;lt;int&amp;amp;gt; &amp;amp;amp;vec) { for(int

DZYO的博客 522

[BZOJ 1494][NOI 2007]生成树计数(状压DP+最小表示法+矩阵乘法)

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1494思路由于每个点ii只能和点i−Ki-K到i−1i-1连边,因此点i−K+1i-K+1和其前面的所有点一定是都在同一个联通块。因此我们只需要用一个长度为KK的序列来表示点i−K+1i-K+1到点ii的连通性,而其他的点一定是连通的,就不必表示连通性了。这个连通性的序列可以用最小表示法压缩成一

某沙茶的OI代码库 2303

[BZOJ1494][NOI2007]生成树计数(状压dp+矩阵乘法)

Address https://www.lydsy.com/JudgeOnline/problem.php?id=1494 Solution 定义状态: f[i][S]f[i][S]f[i][S] 表示 iii 个点的图,编号差 ≤k≤k\le k 的点对之间有连边,现选出一些边,连通第 111 个点到第 i−ki−ki-k 个点,第 i−k+1i−k+1i-k+1 个点到第 iii ...

女装的你,如此好看! 416

BZOJ 1494 [NOI2007]生成树计数

BZOJ 1494 [NOI2007]生成树计数题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1494题目大意: 给定nn个点的无向图 。节点编号1......n1......n第ii个点与第j个点有边.当且仅当:∣∣i−j∣∣≤k\big|i-j\big|\leq k计算nn个点时图的生成树数量。2≤k≤5  , 2≤n≤10152\l

ZLH_HHHH的博客 899

BZOJ 1494】【NOI 2007生成树计数

http://www.lydsy.com/JudgeOnline/problem.php?id=1494 这道题。。因为k很小,而且我们只关心连续的k个节点的连通性,所以把连续的k个点轮廓线上的连通性的最小表示当做状态来转移。 转移可以构造一个矩阵,构造矩阵不难想,但挺麻烦的。。。 时间复杂度\(O(Mlen2^kk^2+Mlen^3logn)\),Mlen最坏情况下为52。 #incl...

as2886089的博客 91

BZOJ 1494 NOI2007 生成树计数 状压DP+矩阵乘法

题目大意:给定n(n≤1015)n(n\leq 10^{15})个点,编号差不超过k(k≤5)k(k\leq 5)的点之间有连边,问生成树个数 将kk个点的连通性用最小表示法压成状态,那么最多有5252种状态 计算出每个状态的生成树个数,作为初始行向量AA 对于每种状态考虑新加入一个点并向这kk个点连边,每种连法可以转移到哪些状态,得到转移矩阵BB 那么答案就是A∗Bn[A*B^n[所有点都

世界 2446

[BZOJ1494][NOI2007]生成树计数 状压dp 并查集

1494: [NOI2007]生成树计数 Time Limit:5 SecMemory Limit:64 MBSubmit:793Solved:451[Submit][Status][Discuss] Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为n。 ·n个结点的完全图的生成树个数为n...

weixin_30872867的博客 207

BZOJ1494】【NOI2007生成树计数(动态规划,矩阵快速幂)

BZOJ1494】【NOI2007生成树计数(动态规划,矩阵快速幂) 题面 Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为n。 ·n个结点的完全图的生成树个数为n^(n-2)。这两个发现让小栋欣喜若狂,由此更加坚定了他继续计算生成树个数的 想法,他要计算出各种各样图的生成树数目。一天,小栋和同学聚会,大家围坐在一张大圆桌...

weixin_30740581的博客 163

NOI2007/BZOJ1494生成树计数 插头DP

原题走这里 一看数据范围就知道是矩阵快速幂优化 首先,设当前点为iii, 接着就会发现,iii不可能与i−Ki−Ki-K之前的点相连, 因此当前点的连通性只与i−Ki−Ki-K到i−1i−1i-1共K个点的连通性有关。 于是我们可以用d(i,S)d(i,S)d(i,S)来表示当前点为iii,连通性为SSS的情况时的情况数。 使用最小表示法,能够把连通性实质上不同的情况优化到只剩五十几种...

CRTorlonia的博客 484

bzoj1494Noi2007生成树计数

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1494 sol :前排膜拜http://blog.csdn.net/qpswwww/article/details/45362639    虽然dalao们说了一些最小表示法啊什么k=5时只有52种状态啊balabala,然而我并不会.......    因为k很小,可以考虑用状压...

weixin_30912051的博客 93
上一篇: bzoj1493: [NOI2007]项链工厂
下一篇: bzoj1499: [NOI2005]瑰丽华尔兹
zhouyuyang233
博客等级 码龄10年 66粉丝 320原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值