Magic Bracelet(POJ 2888,Burnside 引理 + 矩阵快速幂优化 dp)

政府科技管理者如何提升科技成果评估的准确性与透明度?.docx 政府科技管理者如何提升科技成果评估的准确性与透明度? 立即下载

一、题目链接

Magic Bracelet

二、题目大意

给定 m m m 种不同颜色的魔法珠子,每种颜色的珠子的个数都足够多。

现在要从中挑选 n n n 个珠子,串成一个环形魔法手链。

魔法珠子之间存在 k k k 对排斥关系,互相排斥的两种颜色的珠子不能相邻,否则会发生爆炸。(同一种颜色的珠子之间也可能存在排斥)

请问一共可以制作出多少种不同的手链。

注意,如果两个手链经旋转后能够完全重合在一起,对应位置的珠子颜色完全相同,则视为同一种手链。

答案对 99739973 99739973 99739973 取模。

1 ≤ T ≤ 10 1 ≤ n ≤ 1 0 9 g c d ( n , 9973 ) = 1 1 ≤ m ≤ 10 0 ≤ k ≤ m ( m + 1 ) 2 1 ≤ a , b ≤ m 1 \leq T \leq 10 \quad 1 \leq n \leq 10^9 \quad gcd(n,9973)=1 \quad 1 \leq m \leq 10 \quad 0 \leq k \leq \frac{m(m+1)}{2} \quad 1 \leq a,b \leq m 1≤T≤101≤n≤109gcd(n,9973)=11≤m≤100≤k≤2m(m+1)​1≤a,b≤m.

三、分析

由于循环之间存在限制关系,故无法使用 P o ˊ l y a P\acute olya Poˊlya 定理,而只能使用 B u r n s i d e Burnside Burnside 引理.

旋转操作共有 n n n 种置换,考虑一个置换 P i P_i Pi​:顺时针旋转 i i i 个珠子( 1 ≤ i ≤ n 1 \leq i \leq n 1≤i≤n).

通过二元一次不定方程解得循环长度为 n g c d ( n , i ) \frac{n}{gcd(n,i)} gcd(n,i)n​,于是循环个数为 g c d ( n , i ) gcd(n,i) gcd(n,i).

因此置换 P i P_i Pi​ 的不动点个数等于长度为 g c d ( n , i ) gcd(n,i) gcd(n,i) 的环的合法方案数,记为 F ( g c d ( n , i ) ) F(gcd(n,i)) F(gcd(n,i)).

根据 B u r n s i d e Burnside Burnside 引理可得答案为 A N S = 1 n ∑ i = 1 n F ( g c d ( n , i ) ) \begin{aligned} ANS = \frac{1}{n}\sum_{i=1}^n{F(gcd(n,i))} \end{aligned} ANS=n1​i=1∑n​F(gcd(n,i))​.

由于 n n n 最大 1 0 9 10^9 109,直接枚举 i i i 是无法接受的. 而 g c d ( n , i ) gcd(n,i) gcd(n,i) 最多只有 1600 1600 1600 种,所以我们去枚举 g c d ( n , i ) gcd(n,i) gcd(n,i).

于是 A N S = 1 n ∑ d ∣ n φ ( n d ) F ( d ) \begin{aligned} ANS = \frac{1}{n}\sum_{d|n}\varphi(\frac{n}{d})F(d) \end{aligned} ANS=n1​d∣n∑​φ(dn​)F(d)​,其中 φ ( n d ) \varphi(\frac{n}{d}) φ(dn​) 可以先预处理出 1 0 5 10^5 105 以内的质数再 O ( n / d l n ( n / d ) ) O(\frac{\sqrt{n/d}}{ln(n/d)}) O(ln(n/d)n/d ​​) 求出.

考虑如何计算 F ( d ) F(d) F(d),记 c [ i ] [ j ] c[i][j] c[i][j] 表示颜色 i i i 和颜色 j j j 的珠子能否相邻, f x [ i ] [ j ] f_x[i][j] fx​[i][j] 为第一颗珠子的颜色为 x x x 且 确定了前 i i i 颗珠子的颜色 且 第 i i i 颗珠子颜色为 j j j 的方案数.

则有递推式 f x [ i ] [ j ] = ∑ c [ j ] [ k ] f x [ i − 1 ] [ k ] ( 2 ≤ i ≤ n 1 ≤ j , k ≤ m ) \begin{aligned} f_x[i][j] = \sum_{c[j][k]} f_x[i - 1][k] \quad (2 \leq i \leq n \quad 1 \leq j,k \leq m) \end{aligned} fx​[i][j]=c[j][k]∑​fx​[i−1][k](2≤i≤n1≤j,k≤m)​.

于是 F ( d ) = ∑ x ∑ c [ x ] [ j ] f x [ d ] [ j ] \begin{aligned} F(d) = \sum_{x}\sum_{c[x][j]} f_x[d][j] \end{aligned} F(d)=x∑​c[x][j]∑​fx​[d][j]​

直接 d p dp dp 的时间复杂度是 O ( n m 3 ) O(nm^3) O(nm3) 的,不难发现可以使用矩阵快速幂加速 d p dp dp 递推.

即

[ f 1 [ i ] [ 1 ] f 1 [ i ] [ 2 ] ⋯ f 1 [ i ] [ m ] f 2 [ i ] [ 1 ] f 2 [ i ] [ 2 ] ⋯ f 2 [ i ] [ m ] ⋮ ⋮ ⋮ f m [ i ] [ 1 ] f m [ i ] [ 2 ] ⋯ f m [ i ] [ m ] ] = [ f 1 [ i − 1 ] [ 1 ] f 1 [ i − 1 ] [ 2 ] ⋯ f 1 [ i − 1 ] [ m ] f 2 [ i − 1 ] [ 1 ] f 2 [ i − 1 ] [ 2 ] ⋯ f 2 [ i − 1 ] [ m ] ⋮ ⋮ ⋮ f m [ i − 1 ] [ 1 ] f m [ i − 1 ] [ 2 ] ⋯ f m [ i − 1 ] [ m ] ] [ c [ 1 ] [ 1 ] c [ 1 ] [ 2 ] ⋯ c [ 1 ] [ m ] c [ 2 ] [ 1 ] c [ 2 ] [ 2 ] ⋯ c [ 2 ] [ m ] ⋮ ⋮ ⋮ c [ m ] [ 1 ] c [ m ] [ 2 ] ⋯ c [ m ] [ m ] ] \left[ \begin{matrix} f_1[i][1] & f_1[i][2] & \cdots & f_1[i][m] \\ f_2[i][1] & f_2[i][2] & \cdots & f_2[i][m] \\ \vdots & \vdots & & \vdots \\ f_m[i][1] & f_m[i][2] & \cdots & f_m[i][m] \end{matrix} \right] = \left[ \begin{matrix} f_1[i-1][1] & f_1[i-1][2] & \cdots & f_1[i-1][m] \\ f_2[i-1][1] & f_2[i-1][2] & \cdots & f_2[i-1][m] \\ \vdots & \vdots & & \vdots \\ f_m[i-1][1] & f_m[i-1][2] & \cdots & f_m[i-1][m] \end{matrix} \right] \left[ \begin{matrix} c[1][1] & c[1][2] & \cdots & c[1][m] \\ c[2][1] & c[2][2] & \cdots & c[2][m] \\ \vdots & \vdots & & \vdots \\ c[m][1] & c[m][2] & \cdots & c[m][m] \end{matrix} \right] ⎣⎢⎢⎢⎡​f1​[i][1]f2​[i][1]⋮fm​[i][1]​f1​[i][2]f2​[i][2]⋮fm​[i][2]​⋯⋯⋯​f1​[i][m]f2​[i][m]⋮fm​[i][m]​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​f1​[i−1][1]f2​[i−1][1]⋮fm​[i−1][1]​f1​[i−1][2]f2​[i−1][2]⋮fm​[i−1][2]​⋯⋯⋯​f1​[i−1][m]f2​[i−1][m]⋮fm​[i−1][m]​⎦⎥⎥⎥⎤​⎣⎢⎢⎢⎡​c[1][1]c[2][1]⋮c[m][1]​c[1][2]c[2][2]⋮c[m][2]​⋯⋯⋯​c[1][m]c[2][m]⋮c[m][m]​⎦⎥⎥⎥⎤​

于是

[ f 1 [ d ] [ 1 ] f 1 [ d ] [ 2 ] ⋯ f 1 [ d ] [ m ] f 2 [ d ] [ 1 ] f 2 [ d ] [ 2 ] ⋯ f 2 [ d ] [ m ] ⋮ ⋮ ⋮ f m [ d ] [ 1 ] f m [ d ] [ 2 ] ⋯ f m [ d ] [ m ] ] = [ c [ 1 ] [ 1 ] c [ 1 ] [ 2 ] ⋯ c [ 1 ] [ m ] c [ 2 ] [ 1 ] c [ 2 ] [ 2 ] ⋯ c [ 2 ] [ m ] ⋮ ⋮ ⋮ c [ m ] [ 1 ] c [ m ] [ 2 ] ⋯ c [ m ] [ m ] ] d − 1 \left[ \begin{matrix} f_1[d][1] & f_1[d][2] & \cdots & f_1[d][m] \\ f_2[d][1] & f_2[d][2] & \cdots & f_2[d][m] \\ \vdots & \vdots & & \vdots \\ f_m[d][1] & f_m[d][2] & \cdots & f_m[d][m] \end{matrix} \right] = \left[ \begin{matrix} c[1][1] & c[1][2] & \cdots & c[1][m] \\ c[2][1] & c[2][2] & \cdots & c[2][m] \\ \vdots & \vdots & & \vdots \\ c[m][1] & c[m][2] & \cdots & c[m][m] \end{matrix} \right]^{d-1} ⎣⎢⎢⎢⎡​f1​[d][1]f2​[d][1]⋮fm​[d][1]​f1​[d][2]f2​[d][2]⋮fm​[d][2]​⋯⋯⋯​f1​[d][m]f2​[d][m]⋮fm​[d][m]​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​c[1][1]c[2][1]⋮c[m][1]​c[1][2]c[2][2]⋮c[m][2]​⋯⋯⋯​c[1][m]c[2][m]⋮c[m][m]​⎦⎥⎥⎥⎤​d−1

四、代码实现

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int M = (int)1e5;
const int N = (int)1e5;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = (int)9973;

int n, m, k;
bool c[10][10];

struct Matrix
{
    int D[10][10];

    Matrix operator*(const Matrix& B)const
    {
        Matrix C;
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < m; ++j)
            {
                C.D[i][j] = 0;
                for(int k = 0; k < m; ++k)
                {
                    C.D[i][j] = (C.D[i][j] + D[i][k] * B.D[k][j]) % mod;
                }
            }
        }
        return C;
    }
};

Matrix quick(Matrix A, int b)
{
    Matrix S;
    if(b == 0)
    {
        for(int i = 0; i < m; ++i)
            for(int j = 0; j < m; ++j) S.D[i][j] = (i == j);
    }
    else
    {
        S = A; --b;
        while(b)
        {
            if(b & 1) S = S * A;
            A = A * A;
            b >>= 1;
        }
    }
    return S;
}

bool is_prime[M + 5];
int prime[M + 5], cnt;

void init()
{
    memset(is_prime, 1, sizeof(is_prime));
    is_prime[0] = is_prime[1] = 0;
    for(int i = 2; i <= M; ++i)
    {
        if(is_prime[i]) prime[++cnt] = i;
        for(int j = 1; j <= cnt && i * prime[j] <= M; ++j)
        {
            is_prime[i * prime[j]] = 0;
            if(i % prime[j] == 0) break;
        }
    }
}

int F(int d)
{
    int ans = 0;
    Matrix A;

    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < m; ++j)
        {
            A.D[i][j] = c[i][j];
        }
    }
    A = quick(A, d - 1);
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < m; ++j)
        {
            if(c[i][j]) ans = (ans + A.D[i][j]) % mod;
        }
    }
    return ans;
}

int phi(int n)
{
    int ans = n;
    for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= n; ++i)
    {
        if(n % prime[i] == 0)
        {
            ans = ans / prime[i] * (prime[i] - 1);
            while(n % prime[i] == 0) n /= prime[i];
        }
    }
    if(n > 1) ans = ans / n * (n - 1);
    return ans;
}

int quick(int a, int b, int p = mod)
{
    a %= p;
    int s = 1;
    while(b)
    {
        if(b & 1) s = s * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return s % p;
}

int inv(int n, int p = mod)
{
    return quick(n, p - 2, p);
}

void work()
{
    scanf("%d %d %d", &n, &m, &k);
    for(int i = 0; i < m; ++i) for(int j = 0; j < m; ++j) c[i][j] = 1;
    for(int i = 1, a, b; i <= k; ++i)
    {
        scanf("%d %d", &a, &b);
        --a, --b;
        c[a][b] = c[b][a] = 0;
    }

    int ans = 0;
    for(int d = 1; d * d <= n; ++d)
    {
        if(n % d) continue;
        ans = (ans + phi(n / d) % mod * F(d)) % mod;
        if(d != n / d) ans = (ans + phi(d) % mod * F(n / d)) % mod;
    }
    ans = ans * inv(n) % mod;
    printf("%d\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    init();
    int T; scanf("%d", &T);
    while(T--) work();
//    work();
    return 0;
}
双闭环PWM整流器VOC控制 +SVPWM调制仿真(Simulink仿真实现) 内容概要:本文详细介绍了基于Simulink平台构建的双闭环PWM整流器VOC(虚拟磁链定向控制)与SVPWM(空间矢量脉宽调制)相结合的仿真模型,系统阐述了三相电压型PWM整流器在电压定向控制策略下的建模方法与控制实现。通过设计外环直流电压控制与内环电流控制的双闭环结构,实现了对整流器的高功率因数运行、能量双向流动及动态性能优化的精确调控。结合SVPWM调制技术,有效提升了直流侧电压利用率并显著降低输出电流谐波含量,增强了系统的整体效率与稳定性。该仿真模型适用于新能源发电、电动汽车充电系统、微电网等高性能电能变换应用场景,文档还配套提供了丰富的学习资源与技术支持渠道,便于深入研究与工程实践。; 适合人群:面向电气工程、自动化、电力电子及相关专业的高校学生、科研人员以及从事新能源、智能电网、电力传动等领域研发工作的工程师;尤其适合已具备自动控制理论、电力电子变换技术和MATLAB/Simulink仿真基础的专业人士进一步深化学习与应用。; 使用场景及目标:①深入理解PWM整流器的工作机理及其双闭环控制系统的架构设计;②掌握VOC控制与SVPWM调制的协同工作机制,提升系统动静态响应性能;③支撑科研课题、课程设计、毕业设计或实际工程项目中的整流器控制系统开发与验证;④作为高级电能变换技术的学习范例,促进对现代电力电子系统控制策略的综合理解与创新能力培养。; 阅读建议:建议结合文中提供的百度网盘链接与公众号资源,下载完整的Simulink仿真模型进行实操演练,在MATLAB环境中调整控制器参数并观察仿真结果,深入剖析控制逻辑与系统响应特性;同时可参考同系列资源如PI双闭环控制、电网不平衡工况下的控制策略等案例,开展对比分析与拓展研究,全面提升系统建模与控制设计的综合能力。 立即下载

相关推荐

FPGA八股文(2)——笔试的FPGA问题汇总(持续更新)

常见FPGA笔试题的概念总结

居安士的博客 8902

Magic Bracelet-【群论】【Burnside引理】【矩阵快速幂】

那么我们可以枚举第1个点的颜色,输出f[n+1][k]即可,f[n+1][k]完全由f[n][]整体推出,除了去掉与1排斥的条件,都是相同的。由此我们得出第1个点属于第一个循环,第2个点属于第二个循环,直至第n个点属于第n个循环,第n+1个点属于第一个循环。也就是说,前n个点我们就可以确定这n个循环的状态,也就是整个圆的状态,只要我们求出满足题目排斥要求的n个点的排列方案数,那么整个圆也就被确定了。显然可以设f[i][j]为第i个点是j颜色的方案数,那么它由上一个点转移而来,转移方程为。......

jisuanji2606414的博客 841

2022-2028年全球与中国玄武岩连续纤维(BCF)行业深度分析

本文研究全球与中国市场玄武岩连续纤维(BCF)的发展现状及未来发展趋势,分别从生产和消费的角度分析玄武岩连续纤维(BCF)的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。 主要生产商包括: Kamenny Vek TESPE Mafic Technobasalt Russian Basalt ISOMATEX SA Sudaglass Basalt Fiber INNEGRA LAVAint

Fj69258的博客 614

POJ-2888 Magic Bracelet (polya定理+dp矩阵快速幂)

题目:用m种颜色给长度为n的项链染色,其中k对颜色不能相邻,旋转相同看作同一种方案,问方案数,结果模9973 。 思路:对于一段上的方案数是,dp[i][j]=sigma(dp[i-1][k]) (j与k可以相邻);长度非常大的时候这是做不了的,看到这个形式就可以考虑一下矩阵快速幂了。然后应用polya计数。 #include&lt;cstdio&gt; #include&lt;cstrin...

XFire的博客 381

Qt绘图库对决:QWT与QCustomPlot的实战选型指南

本文为Qt开发者提供了QWT与QCustomPlot两大绘图库的实战选型指南。文章从功能特性、性能资源、开发效率三大维度进行深度对比,并结合工业监控、科学计算、嵌入式设备等典型场景,给出了清晰的决策清单。对于需要专业科学图表(如极坐标、等高线图)的场景推荐QWT;对于追求高性能、实时性、快速开发及嵌入式部署的通用图表需求,QCustomPlot是更优选择。

alpha的博客 241

Ubuntu服务器通过IPV6端口转发搭建幻兽帕鲁私服实战

本文详细介绍了在Ubuntu服务器上通过IPV6端口转发搭建幻兽帕鲁私服的完整教程。针对只有公网IPV6地址的服务器环境,提供了从硬件检查、端口转发工具配置到游戏服务器安装的全流程解决方案,帮助玩家轻松实现多人联机游戏体验。

weixin_30652491的博客 490

魔术手环(Magic Bracelet)

这一段时间都在研究加速度传感器,顺便写了一个基于加速度传感器的手势识别算法,已经上传到gitHub, 这里是链接路径。魔术手环是针对于这个算法的一个测试demo,有兴趣的话可以看看,欢迎各种拍砖。

lawliet的专栏 1005

钣金设计高薪进阶:从材料工艺到DFMA降本增效全解析

钣金设计是机械制造领域的核心技术之一,它涉及将金属板材通过切割、折弯、焊接等工艺成型为所需零件。其核心原理在于深刻理解材料特性、制造工艺约束与结构力学,以确保设计在功能、成本与可制造性之间取得最佳平衡。这项技术的价值在于,优秀的钣金设计能直接驱动产品降本增效,通过优化材料利用率、简化装配工序和避免设计缺陷,为企业节省大量模具与生产成本。其应用场景广泛,从机箱机柜、汽车部件到电子设备外壳无处不在。本文将聚焦于实现这一价值的关键路径,深入探讨面向制造与装配的设计(DFMA)原则在钣金领域的实战应用,并剖析如何通

weixin_34301132的博客 391

我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

繁凡さん的博客 3494

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1556

GameFramework框架详解之 DataTable配置表模块

一.前言: DataTable模块是项目的配置表模块,配置表一般是从excel导出csv/json/xml格式的,之所以是excel作为源文件,原因是因为策划同学使用配表最方便。然后一键导出到项目中,除了csv/json/xml配置文件外,一般还会伴随着导出配置的实体类,这样研发同学就可以使用了。GameFramework的DataTable模块也是秉持着这种一贯的策略来实现的。 二.DataRow DataRow在excel数据表中,对应的是一行数据,而在代码中对应的其实就是一条数据对象。 接口IData

TxNet 4725

POJ 2888 Magic Bracelet

Problem POJ Solution 由于有染色限制,那我们不方便直接用polya计数。不妨先从最朴素的DP考虑起,设f[i][j]表示染了前i个珠子,且第i个珠子的颜色为j的方案数,由于是环形的,你需要dp到n+1。为了避免重复计算,我们套用一下Burnside引理。 不妨称旋转i个的置换称为置换i。考虑在置换i下,循环节数为gcd(n,i)gcd(n,i)gcd(n,i),那么我们...

Rayment的博客 643

前言:关于作者吴秋生博士与此书简介

博士现为田纳西大学,诺克斯维尔分校,地理系的副教授。他的研究兴趣包括地理信息科学(GIS)、遥感和环境建模。更具体地说,对应用地理空间大数据、机器学习和云计算(例如,谷歌地球引擎、微软行星计算机)来研究环境变化,特别是地表水和湿地淹没动态。吴博士是开放科学和可重复研究的倡导者。他开发了几个用于高级地理空间分析的开源软件包(例如,吴博士还在YouTube上发布了数百个有关GIS和地图绘制的视频。更多有关他的开源项目信息,请访问GitHub(查看他的YouTube频道。.....................

韩天放 6087

POJ2888 Magic Bracelet(Burnside引理+矩阵快速幂优化DP)

POJ2888 Magic Bracelet 原题地址:http://poj.org/problem?id=2888 题意: T组数据。 有n个珠子串成一个环,珠子共有m种,有k个要求说第x种和第y种珠子不能相邻。 我们认为两个可以通过旋转得到的环是同一种,问一共能串出多少本质不同的环。对9973取模。 数据范围 1 ≤ n ≤ 1e9, gcd(n, 9973) = 1,1 ≤ m

Bfk的博客 527

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

POJ2888 Magic Bracelet【Burnside引理 + DP(矩阵加速)求不动点】

题目描述: 大小为n,可用颜色数为m的一串珠子,其中有k对限制某两种颜色不能相邻。问在忽略中心旋转产生的重复下的不同的染色方案数。 n≤109,m≤10,k≤m(m−1)2n\le10^9,m\le10,k\le\frac {m(m-1)}2n≤109,m≤10,k≤2m(m−1)​ 题目分析: 如果没有限制就是裸的Polya,直接phi乘上颜色种数的几次幂求和。 但是有限制就会导致在循环iii步...

Master.Yi的博客 291

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【POJ2888】Magic Bracelet-Burnside引理+数论+DP矩阵优化

【POJ2888】Magic Bracelet-Burnside引理+数论+DP矩阵优化

Maxwei_wzj的OI世界 1759

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Magic Bracelet POJ - 2888 Burnside引理+数论+DP矩阵优化

题目链接Ginny’s birthday is coming soon. Harry Potter is preparing a birthday present for his new girlfriend. The present is a magic bracelet which consists of n magic beads. The are m kinds of different m

wood 686

POJ - 2888 Magic Bracelet——Polya+欧拉函数+dp+矩阵快速幂+费马小定理

题意: 给定n个珠子构成的环,每个珠子有m种染色方式,给定k个二元组(xi,yi),表示颜色xi不能和颜色yi相邻,问有这个环多少种本质不同的染色方案(两种染色方案视为相同当且仅当他们可以通过旋转变成相同的方案),最终结果取余9973。 (1&lt;=n&lt;=1e9 &amp;&amp; gcd(n, 9973) = 1), (1 &lt;= m &lt;= 10), (1 &lt;= k...

hao_zong_yin的博客 442

poj 2888 Magic Bracelet polya计数+矩阵统计路径数

题意:        用m种颜色涂n个小球组成的项链,其中k对颜色不能相邻,求一共有多少种方案。 分析:       polya计数,难点是对于一个置换p,怎样确定在p下等价的方案数。设p的循环节数为i,如果没有限制显然是m^i,有限制的话怎么办呢?考虑将每一种方案转化为路径,比如a->b->c->a,那么循环节数为i的方案数就是a到a加上b到b...长为i的不同路径数。. 代码: //

sepNINE的专栏 464

POJ 2888 Magic Bracelet (有限制的Burnside引理)

POJ 2154的加强,对相邻元素的颜色做出了限制,但是仍然用到了 循环个数 : gcd(i,n)  循环长度:n/gcd(i,n)的结论,另外需要利用一个特性为对于含gcd(i,n)个长度为n/gcd(i,n)的置换,从置换的某一位置起的gcd(i,n)个元素是分别属于不同的循环的,同一个循环内的颜色是相同的,因此我们对于一个这样的置换求解的方案数便为:用m种颜色染色 a1,a2,...agcd

新的开始... 789

poj-2888 Magic Bracelet

题意: 给出n个珠子的项链和m种珠子; 珠子之间有k对关系,这些珠子不能相邻; 无法通过旋转变成相同的项链视为本质不同; 求本质不同的项链个数,答案对9973取模; n 题解: 这显然是一个置换计数的问题; 上burnside引理还是选择poi? 上burnside引理,因为poi定理对颜色的限制要很宽泛才行! 先考虑一种置换姿势,旋转x个珠子; 那么就将项链分成了g

140142 1555

POJ 2888-Magic Bracelet(polya计数定理)

Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 6024 Accepted: 1922 DescriptionGinny’s birthday is coming soon. Harry Potter is preparing a birthday present for h

swust5120160705的博客 642

[POJ2888]Magic Bracelet(置换群+矩阵)

题目描述传送门题解将每一个颜色看成是一个点,若两个颜色不能同时选视为两个点之间无边,否则有边。这样的话,令f(i)f(i)表示在这个图中存在多少个长度为i的环 那么答案即为∑i=1nf(gcd(i,n))=∑d|nφ(nd)f(d)\sum\limits_{i=1}^nf(gcd(i,n))=\sum\limits_{d|n}\varphi({n\over d})f(d) 求f(i)f(i)的方

zyf2000 651

poj 2888 Magic Bracelet

burnside+欧拉函数+矩阵乘法

我要吃熊猫 798

[POJ2888] Magic Bracelet

[POJ2888]Magic Bracelet 题目描述 简要题意:给圆上个点染色,颜色有种,其中对颜色不能相邻,循环同构,多组数据,询问染色方案数。 Solution 大概就是一道挺显然的Burnside题(一般染色,循环同构都酱紫做)。 对于一个圆上的循环同构,显然有个置换,用Burnside引理求解答案: 所以我们可以枚举置换中的循环个数,令 为不考虑循环同构时...

xmr_pursue_dreams的博客 322
上一篇: 牛客小白月赛31【解题报告】
下一篇: 2021牛客寒假算法基础集训营1【解题报告】
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值