传送门

求每个珠子的方案数

即有序的求三元组 \((x,y,z),x,y,z\le a\) 满足 \(gcd(x,y,z)=1\)

设 \(G_i\) 表示 \(i\) 个小于等于 \(a\) 的有序数字,满足 \(gcd=1\) 的方案数

容斥得到要求的

\[\frac{1}{6}(G_3+2G_2+3G_1)
\]

然后 \(G_1=1\)

运用简单莫比乌斯反演得到

\[G_2=\sum_{i=1}^{a}\lfloor\frac{a}{i}\rfloor^2\mu(i)
\]

\[G_3=\sum_{i=1}^{a}\lfloor\frac{a}{i}\rfloor^3\mu(i)
\]

求项链条数

运用 \(Polya\) 定理

设 \(f(x)\) 表示 \(x\) 的点的环,选择上面求出的 \(m\) 种颜色,同色不相邻的方案数

那么要求的就是

\[\frac{1}{n}\sum_{i=1}^{n}f(gcd(i,n))=\frac{1}{n}\sum_{d|n}f(d)\varphi(\frac{n}{d})
\]

求f

容斥不好做

朴素想法是枚举开始和结尾的颜色,显然也不好做

考虑增量算 \(f(x)\)

首先可以断开 \(x-1\) 的链

\(x-1\) 的首尾不同,贡献为 \((m-2)f(x-1)\)

\(x-1\) 的首尾相同,贡献为 \((m-1)f(x-2)\)

那么 \(f(x)=(m-2)f(x-1)+(m-1)f(x-2)\)

本题应该是默认 \(f(1)=0\),不然过不了样例

直接构造生成函数 \(F(x)=\sum_{i=0}^{x}f(i)x^i\)

那么 \(F(x)=(m-2)F(x)x+(m-1)F(x-2)x^2+f(2)\)

所以

\[F(x)=\frac{m-1}{1-(m-1)x}-\frac{m-1}{1+x}
\]

\(f(x)=(m-1)^x-(-1)^{x-1}(m-1)\)

最后

注意到 \(n\) 可能是 \(10^9+7\) 的倍数

可以考虑对 \((10^9+7)^2\) 取模

如果是倍数,初始答案算出来和 \(n\) 一起除去 \(mod\) 再求逆元即可

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn(1e7 + 5);
const int mod(1e9 + 7);
const ll dmod((ll)mod * mod);
const ll inv6(833333345000000041ll); inline void Inc(ll &x, ll y) {
x = x + y >= dmod ? x + y - dmod : x + y;
} inline ll Mul(ll x, ll y) {
return (x * y - (ll)(((long double)x * y + 0.5) / (long double)dmod) * dmod + dmod) % dmod;
} inline ll Pow1(ll x, ll y) {
register ll ret = 1;
for (x %= mod, y %= mod - 1; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
} inline ll Pow2(ll x, ll y) {
register ll ret = 1;
for (; y; y >>= 1, x = Mul(x, x)) if (y & 1) ret = Mul(ret, x);
return ret;
} int test, pr[maxn / 10], tot, mu[maxn], cnt;
bitset <maxn> ispr;
ll n, a, ret, ans, d[maxn], ct[maxn]; inline ll Calc(ll x) {
register ll v = Pow2(ret, x);
(x & 1) ? Inc(v, dmod - ret) : Inc(v, ret);
return v;
} void Dfs(int x, ll v, ll phi) {
if (x > cnt) {
Inc(ans, Mul(phi, Calc(n / v)));
return;
}
register int i;
Dfs(x + 1, v, phi), v = v * d[x], phi = phi * (d[x] - 1), Dfs(x + 1, v, phi);
for (i = 2; i <= ct[x]; ++i) v *= d[x], phi *= d[x], Dfs(x + 1, v, phi);
} inline void Solve() {
register ll i, j, x;
scanf("%lld%lld", &n, &a), ans = 0, ret = 2;
for (i = 1; i <= a; i = j + 1) {
j = a / (a / i);
Inc(ret, Mul(Mul(Mul((a / i) + 3, a / i), a / i), (mu[j] - mu[i - 1] + dmod) % dmod));
}
ret = Mul(ret, inv6), Inc(ret, dmod - 1);
for (i = 1, cnt = 0, x = n; i <= tot && pr[i] <= x / pr[i]; ++i)
if (x % pr[i] == 0) {
d[++cnt] = pr[i], ct[cnt] = 0;
while (x % pr[i] == 0) x /= pr[i], ++ct[cnt];
}
if (x > 1) d[++cnt] = x, ct[cnt] = 1;
Dfs(1, 1, 1);
if (n % mod) ans = Mul(ans, Pow2(n, dmod - 2)), ans %= mod;
else ans = (ans / mod) % mod * Pow1(n / mod, mod - 2) % mod;
printf("%lld\n", ans);
} int main() {
register int i, j;
ispr[1] = 1, mu[1] = 1;
for (i = 2; i < maxn; ++i) {
if (!ispr[i]) pr[++tot] = i, mu[i] = -1;
for (j = 1; j <= tot && i * pr[j] < maxn; ++j) {
ispr[i * pr[j]] = 1;
if (i % pr[j]) mu[i * pr[j]] = -mu[i];
else {
mu[i * pr[j]] = 0;
break;
}
}
}
for (i = 2; i < maxn; ++i) mu[i] += mu[i - 1];
scanf("%d", &test);
while (test) Solve(), --test;
return 0;
}

Luogu3307:[SDOI2013]项链的更多相关文章

  1. BZOJ3202 [Sdoi2013]项链

    Problem E: [Sdoi2013]项链 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 427  Solved: 146[Submit][Sta ...

  2. bzoj 3202: [Sdoi2013]项链

    Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ...

  3. bzoj3202:[Sdoi2013]项链

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

  4. 洛谷P3307 [SDOI2013]项链 [polya定理,莫比乌斯反演]

    传送门 思路 很明显的一个思路:先搞出有多少种珠子,再求有多少种项链. 珠子 考虑这个式子: \[ S3=\sum_{i=1}^a \sum_{j=1}^a\sum_{k=1}^a [\gcd(i,j ...

  5. [SDOI2013]项链

    description luogu 最近,铭铭迷恋上了一种项链.与其他珍珠项链基本上相同,不过这种项链的珠子却与众不同,是正三菱柱的泰山石雕刻而成的. 三菱柱的侧面是正方形构成的,上面刻有数字. 能够 ...

  6. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  7. bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...

  8. 洛谷 P3307 - [SDOI2013]项链(Burnside 引理+数论)

    题面传送门 看到题目我们显然可以将题目拆分成两部分:首先求出有多少个符合要求的珠子 \(c\),这样我们就可以将每种珠子看成一种颜色,题目也就等价于有多少种用 \(c\) 种颜色染长度为 \(n\) ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. H5入门基础(一)

    我们还是围绕这几个问题来学习: 1.什么是H5? 2.为什么要用H5? 3.怎么用H5? 1.什么是H5? ♦HTML是指超文本标记语言(Hyper Text Markup Language). ♦H ...

  2. 给对象和函数添加method方法

    蝴蝶书中有一个method方法,用来给函数定义方法.看了之后,想着能不能给对象也定义方法呢?. 下面的代码可以实现给函数定义方法: //Function method Function.prototy ...

  3. 10分钟教你用Python打造微信天气预报机器人

    01 前言 最近武汉的天气越来越恶劣了.动不动就下雨,所以,拥有一款好的天气预报工具,对于我们大学生来说,还真是挺重要的了.好了,自己动手,丰衣足食,我们来用Python打造一个天气预报的微信机器人吧 ...

  4. hibernate与Oracle

    今天在用hibernate连接Oracle数据库进行查询时,出现一点小状况 数据库中是有数据的,而且程序本身也没有问题,可就是查不出数据,在经过几个小时的查找下,中遇找到了问题所在,那就是我Oracl ...

  5. 1. C++11保证稳定性与兼容性

    1.1 __func__预定义标识符 在c99中,__func__基本功能是返回所在函数的名字,c++11中允许使用在类或结构体中. #include <iostream> using n ...

  6. 启动多个appium服务(同时运行多台设备)

    准备: 一台真机一台模拟器(使用的是“夜神模拟器”) 先查看是否检测到设备  adb devices    由上图可看出没有检测到模拟器(夜神模拟器已开启) 可通过以下配置完成: 第一步:找到adb的 ...

  7. mfix输出自定义数据

    有时候需要输出一些自定义的网格或者DEM颗粒信息,比如输出颗粒的受力,这里举例颗粒自定义数据的输出.网格自定义输出方法类似. 首先用FileLocatorPro(网上很多绿色版),搜索一下代码里mod ...

  8. c# java数据类型不同点

    导读:C#和Java是当今最火热的两门面向对象编程语言,很多程序都是既开发Java,也涉足C#.不得不说这两门编程语言有很多共同点,这里主要比较一下Java和C#数据类型的不同之处,这些小的区别有时甚 ...

  9. Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法

    Apple的系统升级终于免费了,可开心满满地升级到OS X Mavericks后,Android模拟器之王Genymotion罢工了.遇到两个问题:1. Unable to load VirtualB ...

  10. 第十篇--------javascript函数-参数

    javascript函数的参数:形参,实参 //function 参数 //形参列表 function test(a,b,c,d){ //alert(test.length); //形参个数,4个 / ...