Magic Bracelet
Time Limit: 2000MS   Memory Limit: 131072K
Total Submissions: 4990   Accepted: 1610

Description

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 magic beads. Each kind of beads has its unique characteristic. Stringing many beads together a beautiful circular magic bracelet will be made. As Harry Potter’s friend Hermione has pointed out, beads of certain pairs of kinds will interact with each other and explode, Harry Potter must be very careful to make sure that beads of these pairs are not stringed next to each other.

There infinite beads of each kind. How many different bracelets can Harry make if repetitions produced by rotation around the center of the bracelet are neglected? Find the answer taken modulo 9973.

Input

The first line of the input contains the number of test cases.

Each test cases starts with a line containing three integers n (1 ≤ n ≤ 109gcd(n, 9973) = 1), m (1 ≤ m ≤ 10), k (1 ≤ k ≤ m(m − 1) ⁄ 2). The next k lines each contain two integers a and b (1 ≤ab ≤ m), indicating beads of kind a cannot be stringed to beads of kind b.

Output

Output the answer of each test case on a separate line.

Sample Input

4
3 2 0
3 2 1
1 2
3 2 2
1 1
1 2
3 2 3
1 1
1 2
2 2

Sample Output

4
2
1
0

Source

/*
poj 2888 Magic Bracelet(Polya+矩阵快速幂)

给你m个不同的珠子组成一个长度为n的项链   (个人理解),只考虑旋转的情况下总共能够成
多少种不同的项链。 而且规定有的珠子不能挨在一起

大致还是Polya计数,只是要想办法解决找出长度为i的循环节有多少个。于是乎可以考虑
矩阵快速幂(一个经典问题:解决m步从a走到b的方案数)

主要是一直TLE,知道后来把euler改成通过素数求才过- -.   而且取模过多好像也会TLE

hhh-2016-04-19 22:31:42
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
using namespace std;
#define lson  (i<<1)
#define rson  ((i<<1)|1)
//typedef long long ll;
using namespace std;
;
struct Matrix
{
    ][];
};

int n,m;
int isprime[maxn];
int prime[maxn];
int pnum;
void get_prime()
{
    pnum = ;
    memset(isprime, -, sizeof(isprime));
    ; i <= maxn-; i ++)
        if(isprime[i])
        {
            prime[pnum ++] = i;
            ; j += i)
                isprime[j] = ;
        }
}

Matrix mult(Matrix ta,Matrix tb, int mod)
{
    Matrix tc;
    memset(tc.ma,,sizeof(tc.ma));
    ; i < m; i ++)
        ; k < m; k ++)
            if(ta.ma[i][k])
            {
                ; j < m; j ++)
                    if(tb.ma[k][j])
                        tc.ma[i][j] = (tc.ma[i][j] + ta.ma[i][k] * tb.ma[k][j]) % mod;
            }
    return tc;
}

Matrix Mat_pow(Matrix ta,int n,int mod)
{
    Matrix t;
    memset(t.ma,,sizeof(t.ma));
    ; i < m; i++)
        t.ma[i][i] = ;
    while(n)
    {
        ) t = mult(t,ta,mod);
        ta = mult(ta,ta,mod);
        n >>= ;
    }
    return t;
}

int pow_mod(int a,int n,int mod)
{
    ;
    a %= mod;
    while(n)
    {
        ) ret = ret*a,ret%=mod;
        a = a*a;
        a%=mod;
        n >>= ;
    }
    return ret;
}
int mod;
int euler(int cur )
{
    int ans, x;
    ans = x = cur;
    ; i < pnum && prime[i] * prime[i] <= cur; i++)
        )
        {
            ans = ans / prime[i] * (prime[i] - );
            )
                x /= prime[i];
        }
    )
        ans = ans / x * (x - );
    return ans%mod;
}

Matrix mat;
int cal(int len)
{
    ;
    Matrix t = Mat_pow(mat,len,mod);
    ; i < m; i++)
        ret = ret + t.ma[i][i];
    ret %= mod;

    return ret;
}

int Polya(int n)
{
    ;
    ; i*i <= n; i++)
    {
        )
        {
            if(i*i == n)
            {
                ans = ans+cal(i)*euler(i);
                ans%=mod;
            }
            else
            {
                ans = (ans+cal(i)*euler(n/i)+cal(n/i)*euler(i));
                ans%=mod;
            }
        }
    }
    ans = ans*pow_mod(n,mod-,mod);
    return ans % mod;
}

int main()
{
    int T;
    get_prime();
    mod = ;
    scanf("%d",&T);
    while(T--)
    {
        int k;
        scanf("%d%d%d",&n,&m,&k);
        int u,v;
        ; i < m; i++)
            ; j < m; j++)
                mat.ma[i][j] = ;
        ; i <= k; i++)
        {
            scanf("%d%d",&u,&v);
            mat.ma[u-][v-] = mat.ma[v-][u-] = ;
        }
        printf("%d\n",Polya(n));
    }
    ;
}

poj 2888 Magic Bracelet(Polya+矩阵快速幂)的更多相关文章

  1. POJ 2888 Magic Bracelet [Polya 矩阵乘法]

    传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...

  2. poj 2888 Magic Bracelet &lt;polya定理&gt;

    题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...

  3. [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]

    也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...

  4. poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化

    题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...

  5. POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

    矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...

  6. POJ 3233 Matrix Power Series 矩阵快速幂

    设S[k] = A + A^2 +````+A^k. 设矩阵T = A[1] 0 E E 这里的E为n*n单位方阵,0为n*n方阵 令A[k] = A ^ k 矩阵B[k] = A[k+1] S[k] ...

  7. D. Magic Gems(矩阵快速幂 || 无敌杜教)

    https://codeforces.com/contest/1117/problem/D 题解:有一些魔法宝石,魔法宝石可以分成m个普通宝石,每个宝石(包括魔法宝石)占用1个空间,让你求占用n个空间 ...

  8. poj 3613 Cow Relays【矩阵快速幂+Floyd】

    !:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...

  9. Educational Codeforces Round 60 (Rated for Div. 2) D. Magic Gems(矩阵快速幂)

    题目传送门 题意: 一个魔法水晶可以分裂成m个水晶,求放满n个水晶的方案数(mol1e9+7) 思路: 线性dp,dp[i]=dp[i]+dp[i-m]; 由于n到1e18,所以要用到矩阵快速幂优化 ...

随机推荐

  1. git的合并与推送

    集中式合作模式 1.git fetch 获取远程更新 2.git merge origin/master 进行合并,如果报错,则相应解决.注:你得用git bash命令行执行才能看见报错详情,用ecl ...

  2. Android Studio--学习系列(1)

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...

  3. 【原创】一起学C++ 之enum ---------C++ primer plus(第6版)

    枚举 定义:在默认情况下讲整数值赋给枚举量,第一个枚举量的值为0,第二个枚举量的值为1,依次+1 一.定义一个枚举,枚举类型,枚举量 *与C#相比个人认为C++的enum不好一点是不能通过枚举名点其中 ...

  4. C/C++取出变量的每一位的值(第一次知道还有QBitArray)

    前写程序最多也只是字节级别操作,用char和memcpy进行一系列内存操作.此次一个sdk,其状态值直接是每位一个标示,所以需要取出每位进行操作.当然CPP也有丰富的位运算操作,但是虽然也学过,知道意 ...

  5. Python3基础 nonlocal关键字 内部函数访问到外部函数的变量

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  6. JavaScript进阶(五)js中取小数整数部分函数

    js中取小数整数部分函数 丢弃小数部分,保留整数部分 js:parseInt(7/2) 向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 四舍五入 js: Math.round(7 ...

  7. sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=&#39;utf8&#39;) #改变标准输出的默认编码

    不论使用urllib还是使用requests库经常会遇到中文编码错误的问题,我就经常遇到,因为python安装在windows平台上,cmd的默认编码为GBK,所以在cmd中显示中文时会经常提示gbk ...

  8. UE4AI行为树笔记

  9. c# 接口的协变和逆变

    如果派生类只是用于输出值,那么这种结构化的委托有效性之间的常数关系叫做协变 就是创建一个派生类委托对象 让派生类赋值给基类对象 协变关键字out 对期望传入基类时允许传入派生对象的特性叫逆变  逆变关 ...

  10. 【BZOJ1082】[SCOI2005]栅栏(搜索)

    [BZOJ1082][SCOI2005]栅栏(搜索) 题面 BZOJ 洛谷 题解 随便写个爆搜,洛谷上就\(80\)分了.先放爆搜代码: #include<iostream> #inclu ...