【SDOI2013】项链

Problem

众所周知。

Solution

将原问题分为两个问题求解。

Part 1

首先求珍珠的种类数。
设fif_ifi​表示满足gcd=igcd = igcd=i的本质不同珍珠个数,
gig_igi​表示满足gcdgcdgcd为iii的倍数的本质不同珍珠个数
则f1f_1f1​就是答案
由定义可得g(i)=∑i∣df(d)g(i)=\sum_{i|d}f(d)g(i)=i∣d∑​f(d)
mobiusmobiusmobius反演得到f(i)=∑i∣dμ(di)g(d)f(i)=\sum_{i|d}\mu(\frac{d}{i})g(d)f(i)=i∣d∑​μ(id​)g(d)
所以f(1)=∑i=1aμ(i)g(i)f(1)=\sum_{i =1}^{a}\mu(i)g(i)f(1)=i=1∑a​μ(i)g(i)
下面计算g(i)g(i)g(i)
iii的倍数有⌊ai⌋\lfloor\frac{a}{i}\rfloor⌊ia​⌋个
考虑旋转和翻折产生的六个置换
由BurnsideBurnsideBurnside引理有g(i)=⌊ai⌋3+3⌊ai⌋2+2⌊ai⌋6g(i)=\frac{\lfloor\frac{a}{i}\rfloor^3+3\lfloor\frac{a}{i}\rfloor^2+2\lfloor\frac{a}{i}\rfloor}{6}g(i)=6⌊ia​⌋3+3⌊ia​⌋2+2⌊ia​⌋​
数论分块即可

Part 2

知道了珍珠的种类数后求本质不同的项链数
先设珍珠的种类数为ccc
不考虑本质不同的条件,先设h(i)h(i)h(i)为相邻不同,首尾不同项链数
初值h(1)=0,h(2)=c(c−1)h(1)=0,h(2)=c(c-1)h(1)=0,h(2)=c(c−1)
考虑转移 讨论放入一个珍珠,左右两边是否相同
若左右相同,则贡献为(c−1)h(i−2)(c-1)h(i-2)(c−1)h(i−2)
若左右不同,则贡献为(c−2)h(i−1)(c-2)h(i-1)(c−2)h(i−1)
综上h(i)=(c−2)h(i−1)+(c−1)h(i−2)h(i)=(c-2)h(i-1)+(c-1)h(i-2)h(i)=(c−2)h(i−1)+(c−1)h(i−2)
注意到这是一个二阶常系数递推关系,特征方程法求得通解为h(i)=(c−1)i+(−1)i(c−1)h(i)=(c-1)^i+(-1)^i(c-1)h(i)=(c−1)i+(−1)i(c−1)
考虑本质不同的方案数
设旋转i位,xjx_jxj​为第j位的种类
则xj=x(j+i)modnx_j = x_{(j+i) mod n}xj​=x(j+i)modn​
将其看作第jjj个点向第(j+i)modn(j+i)modn(j+i)modn个点连一条边
则整个项链成为许多个环,环内个点选的种类相同
环的长度为inlcm(i,)=ngcd(i,n)\frac{in}{lcm(i,)}=\frac{n}{gcd(i,n)}lcm(i,)in​=gcd(i,n)n​
每个环互不相交,因此只需考虑nngcd(i,n)=gcd(i,n)\frac{n}{\frac{n}{gcd(i,n)}}=gcd(i,n)gcd(i,n)n​n​=gcd(i,n)个珍珠的h()h()h()值
由Burnside引理
ans=1n∑i=1nh(gcd(i,n))ans=\frac{1}{n}\sum_{i=1}^{n}h(gcd(i,n))ans=n1​i=1∑n​h(gcd(i,n))
枚举gcd(i,n)gcd(i,n)gcd(i,n),上式成为
ans=1n∑d∣n∑i=1n[gcd(i,n)==d]h(d)=1n∑d∣n∑i=1n[gcd(nd,id)==1]h(d)=1n∑d∣nφ(nd)h(d)\begin{aligned} ans &=\frac{1}{n}\sum_{d|n}\sum_{i=1}^{n}[gcd(i,n)==d]h(d)\\ &=\frac{1}{n}\sum_{d|n}\sum_{i=1}^{n}[gcd(\frac{n}{d},\frac{i}{d})==1]h(d)\\ &=\frac{1}{n}\sum_{d|n}\varphi(\frac{n}{d})h(d) \end{aligned} ans​=n1​d∣n∑​i=1∑n​[gcd(i,n)==d]h(d)=n1​d∣n∑​i=1∑n​[gcd(dn​,di​)==1]h(d)=n1​d∣n∑​φ(dn​)h(d)​
大概的思路到这里就结束了.但是有些细节需要注意.比如φ(nd)\varphi(\frac{n}{d})φ(dn​)无法直接求,需要分解质因数.模数可能会整除nnn
丑码贴在下面

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const LL mod = 1e9 + 7;
const LL MOD = mod * mod;
LL c, n, cnt, ans, a, y[10000][2];
int vis[10000010], prime[10000000], cnt2, T, mu[10000010], sum[10000010];
LL read() {LL res, flag = 1; char ch = getchar();for(; ch > '9' || ch < '0'; ch = getchar())if(ch == '-') flag = -1;for(res = 0; ch >= '0' && ch <= '9'; res = res * 10 + LL(ch - '0'), ch = getchar());return res * flag;
}
LL mul(LL x, LL y, LL mo) {LL z = (long double) x * y / mo + 0.5; z = x * y - z * mo;return (z % mo + mo) % mo;
}
LL Qpower(LL x, LL pnt, LL mo){LL res = 1;x = x % mo;while(pnt) {if(pnt & 1) res = mul(res, x, mo);x = mul(x, x, mo);pnt >>= 1;}return res;
}
LL F(LL x) {return (Qpower(c - 1, x, MOD) + (MOD + (x & 1 ? -1 : 1) * (c - 1)) % MOD) % MOD;}
void dfs(int k, LL p, LL x) {if(k > cnt2) {ans = (ans + mul(p, F(n / x), MOD)) % MOD;return ;}dfs(k + 1, p, x);for(int i = 1; i < y[k][1]; ++i) {p /= y[k][0];x /= y[k][0];dfs(k + 1, p, x);}dfs(k + 1, p / (y[k][0] - 1), x / y[k][0]);
}
int main() {T = read();mu[1] = 1, sum[1] = 1;for(int i = 2; i <= 1e7; ++i) {if(!vis[i]) prime[++cnt] = i, mu[i] = -1;for(int j = 1; j <= cnt && i * prime[j] <= 1e7; ++j) {vis[i * prime[j]] = 1;if(i % prime[j] == 0) break;mu[i * prime[j]] = - mu[i];}sum[i] = sum[i - 1] + mu[i];}while(T--) {ans = c = cnt2 = 0;memset(y, 0, sizeof(y));n = read(), a = read();for(LL l = 1, r; l <= a; l = r + 1) {LL m = a / l;r = a / m;c = (c + mul((sum[r] - sum[l - 1] + MOD) % MOD, mul(((mul(m, mul(m, m, MOD), MOD) + 3 * mul(m, m, MOD) % MOD) % MOD + m * 2 % MOD) % MOD, 833333345000000041ll, MOD), MOD)) % MOD;}LL tmp = n, p = n;for(int i = 1; i <= cnt && prime[i] <= tmp; ++i) {if(tmp % prime[i] == 0) {y[++cnt2][0] = prime[i];p = p / prime[i] * (prime[i] - 1);while(tmp % prime[i] == 0) {y[cnt2][1] ++;tmp /= prime[i];}}}if(tmp > 1) {p = p / tmp * (tmp - 1);y[++cnt2][0] = tmp;y[cnt2][1] = 1;}dfs(1, p, n);if(n % mod == 0) ans = ans / mod * Qpower(n / mod, mod - 2, mod) % mod;else ans = ans % mod * Qpower(n, mod - 2, mod) % mod;printf("%lld\n",ans);}return 0;
}

【SDOI2013】项链 题解相关推荐

  1. bzoj3202:[Sdoi2013]项链

    思路:首先考虑如何求珠子个数,一个珠子由a,b,c三个数组成且属于区间[1,a],并满足gcd(a,b,c)=1.由于要求本质相同,对于a,b,c这样的一个无序的数列且满足gcd(a,b,c)=1,设 ...

  2. 【算法•日更•第七期】区间动态规划详解+一本通1570能量项链题解

    ▎前置基础 啥也不用说,不会动态规划绝对看不懂,请不会动态规划的同志们先戳这里了解基础动态规划. ▎什么是区间动态规划? 区间动态规划可以理解为用了分治的动态规划. 顾名思义,动态规划中涉及了区间,那 ...

  3. 蓝桥算法提高ADV-381 分割项链题解

    分割项链 问题描述 两个强盗刚刚抢到一条十分珍贵的珍珠项链,正在考虑如何分赃.由于他们不想破坏项链的美观,所以只想把项链分成两条连续的珍珠链.然而亲兄弟明算账,他们不希望因为分赃不均导致不必要的麻烦, ...

  4. BZOJ3197:[SDOI2013]刺客信条——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3197 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受 ...

  5. BZOJ1878(SDOI2009)[HH的项链]题解--莫队

    [链接] bzoj1878 [题目大意] 给你一个序列,让你求一段区间中不同数的个数. [解题报告] 此题可以用莫队算法解,n比较小.(其实也可以用数状数组解,但本蒟蒻很懒就没写了..) #inclu ...

  6. BZOJ 4330 JSOI2012 爱之项链

    Problem G: JSOI2012 爱之项链 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 13  Solved: 5 [Submit][Sta ...

  7. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

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

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

  9. 坏掉的项链(洛谷P1203题题解,C++语言描述)

    题目要求 题目链接 分析 链子是循环的,随便选一点断开不合适,所以把它作为一个线性的字符串其实不好. 处理方法是将字符串扩增一倍,即necklace += necklace; 这样的话,我们从初始出发 ...

  10. 【SDOI2013 necklace】项链

    Description (JZOJ 3298) 有一个 n n颗珠子组成的项链 每颗珠子有3个面,可以写3个数字,数字的范围(0,a](0,a],两颗珠子是相同的当且仅当他们可以通过旋转变成一样 每颗 ...

最新文章

  1. python工程师面试题-朋友去面试Python工程师,又带回来几道基础题,Python面试题No10...
  2. 丢掉DDoS的八个幻想
  3. 小米6自动重启android,小米6充电重启怎么办 小米6充电自动重启解决方法
  4. matlab在图片上显示文字颜色,科学网-解决matlab saveas printf保存图片时 colorbar中的字体颜色发生改变-肖鑫的博文...
  5. r graphics installing package
  6. linux基本知识学习
  7. 前端工程师应该达到什么水平,找工作薪资才比较高?
  8. 关于Application.Lock和Lock(obj)
  9. 在线翻译英文html文件,copy html是什么意思
  10. 验证身份证合法性的js
  11. 剑指offer 面试题61. 扑克牌中的顺子
  12. SpringData+JPA+mysql, cannot be null when ‘hibernate.dialect‘ not set
  13. Golang 结构类型
  14. python_dataframe总结1
  15. python3.8下载request_python3 requests 安装包下载安装[windows]
  16. Java实现简单模拟购物程序
  17. Oracle 18c十大新特性
  18. Server 2008 R2 事件查看器实现日志分析
  19. 使用Excel TRIMMEAN忽略异常值
  20. HDU6348 Buy and Resell

热门文章

  1. C# 如何生成CHM帮助文件
  2. C#邮件过滤系统(论文+可执行程序+源码+外文翻译+程序操作演示录像)
  3. 中国步进电机市场现状研究分析与发展前景预测报告(2022)
  4. WARN: Establishing SSL connection without server‘s identity verification
  5. 获取随机数的n种方法,你知道几种
  6. 追本溯源,解密第一性原理(下)
  7. hualinux2.2 环境基础:rpm包安装el6、el7、el8选择
  8. 搜索神器Android,网盘搜索神器
  9. 心情随笔(一):五月随笔满满的正能量
  10. HTTP协议网络请求状态码