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】项链相关推荐

  1. 【SDOI2013】项链【莫比乌斯反演】【Polya定理】【递推式求通项】【数论】

    题意:TTT 组数据,每组给定 n,an,an,a,求满足下列条件的项链数量: 有 nnn 个珠子. 每个珠子上有三个 [1,a]∩Z[1,a]\cap \Z[1,a]∩Z 的数,且三个数 gcd⁡\ ...

  2. ImageNet中英文类别对照

    0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...

  3. JAVA项目 ----宠物小精灵12.1

    pokemon 下面的 Pokemon -------------------------------------------------------------------------------- ...

  4. ImageNet Large Scale Visual Recognition Competition (ILSVRC)-ImageNet数据集标签名称中英文对照

    0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...

  5. 越狱Season 1- Episode 18: Bluff

    Season 1, Episode 18: Bluff -Michael: Scofield Scofield Michael Scofield Michael Scofield -Patoshik: ...

  6. Life Situation Two

    一 Before leaving home 学到了: 1,某人为啥做某事 : 妆扮打扮 : 在去..的路上 ; 穿着的 ; 问某人准备做...:  大多数:错过...:不要紧,无论怎样:记得做: 2, ...

  7. 学java能打开大脑思维_脑科学:一句“去你的吧”,就可以判断出你是左脑型思维还是右脑型思维!...

    原标题:脑科学:一句"去你的吧",就可以判断出你是左脑型思维还是右脑型思维! 喜欢我,关注我☝ 本图跟本文无关,来自网络 先给个句子,大家读一读:去你的吧! 这个短句子,在现实生活 ...

  8. 战神引挚手游数据库解析mysql/mir

    mysql/mir库: awardplayer 领养账号 字段: Idx 编号 PTID PTID HumName 人名 Level 人物等级 job 职业 sex 性别 Status 帐号状态 fi ...

  9. mysql在手游中的作用_战神引挚手游数据库解析mysql/mir

    mysql/mir库: awardplayer 领养账号 字段: Idx 编号 PTID PTID HumName 人名 Level 人物等级 job 职业 sex 性别 Status 帐号状态 fi ...

最新文章

  1. 神经网络入门——14多层感知机
  2. 3个写进简历的京东AINLP项目实战
  3. c code first mysql_Code First for MySql命令操作
  4. 【从caffe到Tensorflow 1】io 操作
  5. iOS之深入解析Runtime的objc_msgSend“快速查找”底层原理
  6. Windows下无法新建文件夹
  7. oracle rank 语法_oracle rank函数怎么用
  8. 跨境电商erp有哪些功能?跨境erp是跨境电商卖家必备么?
  9. mysql 拼音首字母排序
  10. 中兴新支点操作系统_中兴新支点操作系统
  11. It Is Not the Journey But the Destination: Endpoint Conditioned Trajectory Prediction
  12. 目前最完美的魔兽世界服务端AzerothCore,Window系统小白10分钟搭建教程
  13. JavaSwing也惊艳之一:水晶之恋
  14. 计算机工资表2017,2017事业单位工资标准表
  15. 如何使用Tenderly在Moonbeam上构建更优秀的Dapp
  16. 深信服EDR终端检测平台-RCE漏洞复现
  17. H.265/HEVC学习笔记:变换
  18. 怎么将几个QQ对话窗口合并和分离
  19. Linux:未定义引用`CPU_ZERO‘
  20. 分支定界 matlab,使用MATLAB实现分枝定界法求解整数规划的详细资料说明

热门文章

  1. Chapter 1. OpenGL基础回顾 - Review of OpenGL Basics
  2. 重量(计量单位)英文缩写和转换表
  3. 雅虎NCP:网络黄页的终结者
  4. PO等等6种对象包命名含义:PO、VO、BO、DTO、POJO、DAO
  5. 西交计算机专业课,20双非跨考上岸西交计算机(912)
  6. 人关节软骨细胞的体外培养
  7. QtAndroid详解(1):QAndroidJniObject
  8. 这所C9高校的8个CS院系,有你心仪的吗?
  9. 三、多元线性回归模型(计量经济学学习笔记)
  10. AT32 MCU QR USB HID Keyboard例程