bzoj 4330: JSOI2012 爱之项链
听说这题不公开.. 那就不贴题意了
首先要用burnside引理求出戒指的种数,那么对于一个顺时针旋转$k$个位置的置换就相当于连上一条$(i,(i+k)%R)$的边,每个环颜色必须相同
环的个数为$gcd(k,R)$,所以这样的方案数就有$R^{gcd(k,R)}$种
然后dp求项链的方案数,设$g_{i,0}$表示$1$和$i$不同,中间相邻不同的方案数,$g_{i,1}$表示$1$和$i$相同,中间相邻不同的方案数
那么有如下推导:
$$g_{i,0}=(i-1)g_{i-1,1}+(i-2)g_{i-1,0}$$
$$g_{i,1}=g_{i-1,0}$$
再化一下:$$g_{i,0}=(i-1)g_{i-2,0}+(i-2)g_{i-1,0}$$
由于我们需要的也就是$g_{i,0}$,不妨设$f_i=g_{i,0}$,所以:$$f_i=(i-1)f_{i-2}+(i-2)f_{i-1}$$
这就可以用矩阵乘法优化 听说有通项公式
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
const LL Mod = ;
const LL Maxn = ;
LL n, m, r;
LL gcd ( LL a, LL b ){
if ( a == ) return b;
return gcd ( b%a, a );
}
LL pow ( LL x, LL k ){
LL ret = ;
while (k){
if ( k & ) ret = (ret*x)%Mod;
x = (x*x)%Mod;
k >>= ;
}
return ret;
}
struct matrix {
LL a[][];
LL l1, l2;
void clear (){ memset ( a, , sizeof (a) ); }
}trans, x, z, fi;
matrix ttimes ( matrix x, matrix y ){
matrix ret;
ret.clear ();
ret.l1 = x.l1; ret.l2 = y.l2;
LL i, j, k;
for ( i = ; i < ret.l1; i ++ ){
for ( j = ; j < ret.l2; j ++ ){
for ( k = ; k < x.l2; k ++ ){
ret.a[i][j] = ( ret.a[i][j] + (x.a[i][k]*y.a[k][j])%Mod ) % Mod;
}
}
}
return ret;
}
LL phi ( LL x ){
LL ret = x, sq = sqrt (x);
for ( LL i = ; i <= sq; i ++ ){
if ( x % i == ){
ret = ret/i*(i-);
while ( x % i == ) x /= i;
}
}
if ( x > ) ret = ret/x*(x-);
return ret;
}
int main (){
LL i, j, k;
scanf ( "%lld%lld%lld", &n, &m, &r );
LL o = , sq = sqrt (m);
for ( i = ; i <= sq; i ++ ){
if ( m % i == ){
o = (o+(pow(r,i)*phi(m/i))%Mod)%Mod;
if ( i*i == m ) continue;
o = (o+(pow(r,m/i)*phi(i))%Mod)%Mod;
}
}
LL inv = pow ( m, Mod- );
o = (o*inv)%Mod;
if ( n == ){ printf ( "0\n" ); return ; }
trans.l1 = trans.l2 = ;
trans.a[][] = o-; trans.a[][] = ; trans.a[][] = o-;
x = trans;
z.l1 = z.l2 = ;
z.a[][] = ; z.a[][] = ;
for ( i = n-; i >= ; i >>= ){
if ( i & ) z = ttimes ( z, x );
x = ttimes ( x, x );
}
fi.l1 = ; fi.l2 = ;
fi.a[][] = (o*(o-))%Mod;
fi = ttimes ( fi, z );
printf ( "%lld\n", fi.a[][] );
return ;
}
bzoj 4330: JSOI2012 爱之项链的更多相关文章
- bzoj4330:JSOI2012 爱之项链
题目大意:一串项链由n个戒指组成,对于每个戒指,一共有M个点,R种颜色,且旋转后相同的戒指是相同的,然后一串项链又由N个戒指组成,同时要满足相邻的两个戒指不能相同,这串项链上某个位置插入了一个特殊的东 ...
- 洛谷 P5233 - [JSOI2012]爱之项链(Polya 定理+递推)
洛谷题面传送门 首先很明显题目暗示我们先求出符合条件的戒指数量,再计算出由这些戒指能够构成的项链的个数,因此考虑分别计算它们.首先是计算符合条件的戒指数量,题目中"可以通过旋转重合的戒指视作 ...
- [BZOJ 4332] [JSOI2012]分零食(DP+FFT)
[BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...
- BZOJ:4333: JSOI2012 智者的考验
4333: JSOI2012 智者的考验 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 68 Solved: 18[Submit][Status][ ...
- BZOJ 1878 hh的项链(简单莫队)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- bzoj 4327: JSOI2012 玄武密码
听说这题不公开.. 那就不贴题意了 一眼看上去还以为是exkmp的裸题.. 看了数据范围,呵呵.. 多串匹配嘛.. 就用AC自动机咯,而且每个点最多也就只有$4$个孩子 用原串在AC自动机上走,碰到的 ...
- BZOJ 1878 HH的项链(树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1878 题意:给出一个数列,每次询问区间[L,R]中有多少个不同的数字? 思路: (1)记 ...
- BZOJ 1878 HH的项链
不能分块(显然复杂度会炸啊.....) 离线+BIT.每个颜色在每个询问中只出现一次. #include<iostream> #include<cstdio> #include ...
- 【题解】bzoj 4327 JSOI2012 玄武密码
原题传送门 我们先对所有询问串建立AC自动机(今天洛咕上有人分不清AC自动机和自动AC机) 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针所能到的所有前缀都是匹配成功的,暴力向 ...
随机推荐
- 菜鸟笔记:java编程基础一
Java中的关键字 Java 语言中有一些具有特殊用途的词被称为关键字.关键字对 Java 的编译器有着特殊的意义,在程序中应用时一定要慎重哦!! Java 中常用关键字: 问:这么多,记不住啊... ...
- JS数组求最大值和最小值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PhotoSwipe插件的使用
1.首先引入插件 <link rel="stylesheet" href="css/photoswipe.css"> <link rel=&q ...
- Redis Cluster 介绍与使用
Redis Cluster 功能特性 Redis 集群是分布式的redis 实现,具有以下特性: 1. 高可用性与可线性扩张到1000个节点 2. 数据自动路由到多个节点 3. 节点间数据共享 4. ...
- 解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
解决mysql Table 'xxx' is marked as crashed and should be repaired的问题. 某个表在进行数据插入和更新时突然出现Table 'xxx' is ...
- QL Server 2008 所有账号丢失sysadmin权限,sa账号亦没有开启,该如何解决??
1. 用Run as a administrator打开命令提示符里输入NET STOP MSSQLSERVER, 即停止MSSQLSERVER运行. 2. 在命令提示符里输入 NET START M ...
- go:结构体的可访问性
1.要使某个符号对其他包( package)可见(即可以访问),需要将该符号定义为以大写字母开头------摘自go相关书籍2.go只限制包内外的可访问性,而不限制同包内不同文件的可访问性 本文讨论结 ...
- yii小细节
1.main.php增加导航栏严格区分大小写,否则会出现404错误 2.增加'分页'功能---前后台的models里面的search.php 添加 public function search($pa ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- 模拟搭建Web项目的真实运行环境(七)
下面这个是mongo驱动的小案例,里面也有涉及到一点redis的操作 https://github.com/SuperRocky/MyMongoDriver 接下来通过几张图片主要介绍一下每个文件的具 ...