poj 2888 Magic Bracelet(Polya+矩阵快速幂)
| 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 ≤ 109, gcd(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 ≤a, b ≤ 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;
const int maxn = ;
struct Matrix
{
int ma[][];
}; int n,m;
int isprime[maxn];
int prime[maxn];
int pnum;
void get_prime()
{
pnum = ;
memset(isprime, -, sizeof(isprime));
for(int i = ; i <= maxn-; i ++)
if(isprime[i])
{
prime[pnum ++] = i;
for(int j = i * i; j <= maxn-; j += i)
isprime[j] = ;
}
} Matrix mult(Matrix ta,Matrix tb, int mod)
{
Matrix tc;
memset(tc.ma,,sizeof(tc.ma));
for(int i = ; i < m; i ++)
for(int k = ; k < m; k ++)
if(ta.ma[i][k])
{
for(int j = ; 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));
for(int i = ; i < m; i++)
t.ma[i][i] = ;
while(n)
{
if(n & ) t = mult(t,ta,mod);
ta = mult(ta,ta,mod);
n >>= ;
}
return t;
} int pow_mod(int a,int n,int mod)
{
int ret = ;
a %= mod;
while(n)
{
if(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;
for(int i = ; i < pnum && prime[i] * prime[i] <= cur; i++)
if(x % prime[i] == )
{
ans = ans / prime[i] * (prime[i] - );
while(x % prime[i] == )
x /= prime[i];
}
if(x > )
ans = ans / x * (x - );
return ans%mod;
} Matrix mat;
int cal(int len)
{
int ret = ;
Matrix t = Mat_pow(mat,len,mod);
for(int i = ; i < m; i++)
ret = ret + t.ma[i][i];
ret %= mod; return ret;
} int Polya(int n)
{
int ans = ;
for(int i= ; i*i <= n; i++)
{
if(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;
for(int i = ; i < m; i++)
for(int j = ; j < m; j++)
mat.ma[i][j] = ;
for(int i = ; i <= k; i++)
{
scanf("%d%d",&u,&v);
mat.ma[u-][v-] = mat.ma[v-][u-] = ;
}
printf("%d\n",Polya(n));
}
return ;
}
poj 2888 Magic Bracelet(Polya+矩阵快速幂)的更多相关文章
- POJ 2888 Magic Bracelet [Polya 矩阵乘法]
传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...
- poj 2888 Magic Bracelet <polya定理>
题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...
- [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]
也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- POJ 3233 Matrix Power Series 矩阵快速幂+二分求和
矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...
- 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] ...
- D. Magic Gems(矩阵快速幂 || 无敌杜教)
https://codeforces.com/contest/1117/problem/D 题解:有一些魔法宝石,魔法宝石可以分成m个普通宝石,每个宝石(包括魔法宝石)占用1个空间,让你求占用n个空间 ...
- poj 3613 Cow Relays【矩阵快速幂+Floyd】
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...
- 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,所以要用到矩阵快速幂优化 ...
随机推荐
- 山西某公司NetApp存储不小心删除文件数据恢复成功案例
故障情况简介: 需要进行数据恢复的设备是一台NetApp存储,共有24块磁盘组成.由于管理员删除文件夹,且时间比较久,删除有几个月时间. 可恢复性判断:由于NetApp中的文件系统的特性,WAFL是& ...
- JS页面跳转的常用方法整理.
<script type="text/javascript"> //js页面跳转 function showtabs() { window.location.href ...
- 使用JDBC中的出现的乱码和查询无结果问题
使用JDBC中的问题 连接的后出现查询结果是乱码. 1.可能是代码的编码与数据库的编码不同 有可以将二者都设置为UTF-8 2.如果比较懒得话可以只设代码为UTF-8 mysql 连接url中us ...
- New UWP Community Toolkit - DropShadowPanel
概述 UWP Community Toolkit 中有一个为 Frmework Element 提供投影效果的控件 - DropShadowPanel,本篇我们结合代码详细讲解 DropShado ...
- SpringBoot项目如何进行打包部署
springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spring ...
- Spring Security入门(3-9)Spring Security登录成功以后
- mysql(2)—— 由笛卡尔积现象分析数据库表的连接
首先,先简单解释一下笛卡尔积. 现在,我们有两个集合A和B. A = {0,1} B = {2,3,4} 集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式: A×B = {(0,2 ...
- RxJava系列6(从微观角度解读RxJava源码)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- Mybatis 中的转义字符
记录以下mybatis中的转义字符,方便以后自己看一下 Mybatis转义字符表 < < 小于 > > 大于 & & 与 ' ' 单引号 &q ...
- Menubutton按钮弹出菜单
#按钮弹出菜单 from tkinter import * root =Tk() def callback(): print('我被调用了') m = Menubutton(root,text = ' ...