【SDOI2013 necklace】项链
Description
(JZOJ 3298)
有一个 n n颗珠子组成的项链
每颗珠子有3个面,可以写3个数字,数字的范围(0,a](0,a],两颗珠子是相同的当且仅当他们可以通过旋转变成一样
每颗珠子上的三个数的最大公约数必须等于1
相邻两颗珠子必须不同
如果两串项链可以通过旋转变成一样的,我们认为这两串项链相同。
给定 n n和aa,求有多少不同的项链?答案对 1000000007 1000000007取模。
Data Constraint
对于 10 10%的 数据: n<=10,a<=10,T<=10 n;
对于 20 20%的 数据: n<=1000,a<=100,T<=10 n;
对于 40 40%的 数据: n<=109,a<=100,T<=10 n;
对于 60 60%的 数据: n<=106,a<=105,T<=10 n;
对于 80 80%的数据: n<=109,a<=105,T<=10 n;
对于 100 100%的 数据: n<=1014,a<=107,T<=10 n;
Solution
先求珠子种类
有用的只有有序对
123 122 112 111
数字表示大小关系
111只有一种
122 112 算出12然后*2
123 算一下
12:
设 F[i][A] F[i][A]表示公约数为 i i,数的取值范围为A的12有序对个数
所求即为F[1][a]F[1][a]
F[1][a]=C(a,2)−∑ai=1F[i][a] F[1][a] = C(a,2) - \sum_{i=1}^a F[i][a]
F[i][a]=∑aq=1∑ap=1gcd(p,q)=i F[i][a] = \sum_{q=1}^a \sum_{p=1}^a gcd(p,q) = i
F[i][a]=∑a/iq=1∑a/ip=1gcd(p,q)=1 F[i][a] = \sum_{q=1}^{a/i} \sum_{p=1}^{a/i} gcd(p,q) = 1
–> F[1][a/i] F[1][a/i](也可以根据定义直接得出)
递归求解 记忆化搜索
123
设 F[i][A] F[i][A]表示公约数为 i i,数的取值范围为aa的123有序对个数
所求即为 F[1][a] F[1][a]
F[1][a]=C(a,3)−∑ai=1F[i][a] F[1][a] = C(a,3) - \sum_{i=1}^a F[i][a]
F[i][a]=F[1][a/i] F[i][a] = F[1][a/i] //根据定义可得
递归求解 记忆化搜索
综上,我们算出了珠子的种类,假设为 M M
接下来是MM种颜色给一个长度为 N N的环染色,相邻不能同色,问方案数
若旋转该环相同则属于同一种方案
设方案数为ansans
其实旋转就是置换,这些置换构成了一个群,叫做置换群
根据Burnside引理
ans=∑F(Ci)/|G| ans={\sum F(C_i)}/|G|
其中 Ci C_i为某种置换类型【即置换群中的某一个元素】, G G为置换群,|G||G|为置换群的大小。
F(Ci) F(C_i) 为该置换下不动点的数量
不动点就是对原问题做一次置换操作后仍不变的点
例如这题就是旋转后还是原来的环 即称为这种旋转的不动点
感性点理解就是相同的方案
我们设 Ci C_i表示旋转 i i颗珠子
F(Ci)=P(gcd(n,i),M)F(C_i) = P(gcd(n,i),M)
P(n,m) P(n,m)表示 M M种颜色给一个长度为NN的环染色且相邻颜色不同的方案数(不考虑旋转)
为什么呢?
假设旋转 k k步
若一颗珠子的位置为ii,旋转后就是 i+k i+k
即 (i+p∗k) (i + p*k) % n 的颜色都必须先相同
考虑哪些位置属于 (i+p∗k) (i + p*k) % n
(i+p∗k) (i + p*k) % n = j
−−>p∗k−p2∗n=j−i --> p*k - p2*n = j-i
根据扩展欧几里得算法
方程有整数解的条件当且仅当 (j−i)|gcd(k,n) (j-i)|gcd(k,n)
所以当 j j与ii不同时, j−i j-i必然不是 gcd(k,n) gcd(k,n)的因子
那么所有的i最多只有 gcd(k,n) gcd(k,n)个
也就是说 gcd(k,n) gcd(k,n)个连续的珠子就决定了这个环
方案数即为 P(gcd(k,n),M) P(gcd(k,n),M)
接下来我们考虑
∑F(Ci)=∑P(gcd(n,i),M) \sum F(C_i) = \sum P(gcd(n,i),M)
∑F(Ci)=∑d|nCnt(d)∗P(d,M) \sum F(C_i) =\sum_{d|n} Cnt(d) * P(d,M)
其中
Cnd(d)=∑ni=1gcd(n,i)=d Cnd(d) = \sum_{i=1}^n gcd(n,i) = d
Cnd(d)=∑n/di=1gcd(n/d,i)=1 Cnd(d) = \sum_{i=1}^{n/d} gcd(n/d,i) = 1
Cnd(d)=Phi(n/d) Cnd(d) = Phi(n/d)
即 ∑F(Ci)=∑d|nPhi(n/d)∗P(d,M) \sum F(C_i) = \sum_{d|n} Phi(n/d) * P(d,M)
P(n,m) P(n,m)怎么求?
P(n,m)=P(n−1,m)∗(m−2)+P(n−2,m)∗(m−1) P(n,m) = P(n - 1, m) * (m - 2) + P(n-2, m) * (m-1)
插入 1 1颗珠子,只有m−2m-2种可能
插入 2 2颗珠子,先放一颗与原开头相同的,再放另一颗的时候就有m−1m-1种可能
且两种插入方式必然没重复(一个首尾不同,一个首尾相同)
特征根求解通项公式
P(n,m)=(m−1)n+(−1)n∗(m−1); P(n,m) = (m-1)^n + (-1)^n * (m-1);
完美得解
【SDOI2013 necklace】项链相关推荐
- 【SDOI2013】项链【莫比乌斯反演】【Polya定理】【递推式求通项】【数论】
题意:TTT 组数据,每组给定 n,an,an,a,求满足下列条件的项链数量: 有 nnn 个珠子. 每个珠子上有三个 [1,a]∩Z[1,a]\cap \Z[1,a]∩Z 的数,且三个数 gcd\ ...
- ImageNet中英文类别对照
0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...
- JAVA项目 ----宠物小精灵12.1
pokemon 下面的 Pokemon -------------------------------------------------------------------------------- ...
- ImageNet Large Scale Visual Recognition Competition (ILSVRC)-ImageNet数据集标签名称中英文对照
0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...
- 越狱Season 1- Episode 18: Bluff
Season 1, Episode 18: Bluff -Michael: Scofield Scofield Michael Scofield Michael Scofield -Patoshik: ...
- Life Situation Two
一 Before leaving home 学到了: 1,某人为啥做某事 : 妆扮打扮 : 在去..的路上 ; 穿着的 ; 问某人准备做...: 大多数:错过...:不要紧,无论怎样:记得做: 2, ...
- 学java能打开大脑思维_脑科学:一句“去你的吧”,就可以判断出你是左脑型思维还是右脑型思维!...
原标题:脑科学:一句"去你的吧",就可以判断出你是左脑型思维还是右脑型思维! 喜欢我,关注我☝ 本图跟本文无关,来自网络 先给个句子,大家读一读:去你的吧! 这个短句子,在现实生活 ...
- 战神引挚手游数据库解析mysql/mir
mysql/mir库: awardplayer 领养账号 字段: Idx 编号 PTID PTID HumName 人名 Level 人物等级 job 职业 sex 性别 Status 帐号状态 fi ...
- mysql在手游中的作用_战神引挚手游数据库解析mysql/mir
mysql/mir库: awardplayer 领养账号 字段: Idx 编号 PTID PTID HumName 人名 Level 人物等级 job 职业 sex 性别 Status 帐号状态 fi ...
最新文章
- 神经网络入门——14多层感知机
- 3个写进简历的京东AINLP项目实战
- c code first mysql_Code First for MySql命令操作
- 【从caffe到Tensorflow 1】io 操作
- iOS之深入解析Runtime的objc_msgSend“快速查找”底层原理
- Windows下无法新建文件夹
- oracle rank 语法_oracle rank函数怎么用
- 跨境电商erp有哪些功能?跨境erp是跨境电商卖家必备么?
- mysql 拼音首字母排序
- 中兴新支点操作系统_中兴新支点操作系统
- It Is Not the Journey But the Destination: Endpoint Conditioned Trajectory Prediction
- 目前最完美的魔兽世界服务端AzerothCore,Window系统小白10分钟搭建教程
- JavaSwing也惊艳之一:水晶之恋
- 计算机工资表2017,2017事业单位工资标准表
- 如何使用Tenderly在Moonbeam上构建更优秀的Dapp
- 深信服EDR终端检测平台-RCE漏洞复现
- H.265/HEVC学习笔记:变换
- 怎么将几个QQ对话窗口合并和分离
- Linux:未定义引用`CPU_ZERO‘
- 分支定界 matlab,使用MATLAB实现分枝定界法求解整数规划的详细资料说明