Luogu3307:[SDOI2013]项链
传送门
求每个珠子的方案数
即有序的求三元组 \((x,y,z),x,y,z\le a\) 满足 \(gcd(x,y,z)=1\)
设 \(G_i\) 表示 \(i\) 个小于等于 \(a\) 的有序数字,满足 \(gcd=1\) 的方案数
容斥得到要求的
\]
然后 \(G_1=1\)
运用简单莫比乌斯反演得到
\]
\]
求项链条数
运用 \(Polya\) 定理
设 \(f(x)\) 表示 \(x\) 的点的环,选择上面求出的 \(m\) 种颜色,同色不相邻的方案数
那么要求的就是
\]
求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)=(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]项链的更多相关文章
- BZOJ3202 [Sdoi2013]项链
		Problem E: [Sdoi2013]项链 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 427 Solved: 146[Submit][Sta ... 
- bzoj 3202: [Sdoi2013]项链
		Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ... 
- bzoj3202:[Sdoi2013]项链
		思路:首先考虑如何求珠子个数,一个珠子由a,b,c三个数组成且属于区间[1,a],并满足gcd(a,b,c)=1.由于要求本质相同,对于a,b,c这样的一个无序的数列且满足gcd(a,b,c)=1,设 ... 
- 洛谷P3307 [SDOI2013]项链 [polya定理,莫比乌斯反演]
		传送门 思路 很明显的一个思路:先搞出有多少种珠子,再求有多少种项链. 珠子 考虑这个式子: \[ S3=\sum_{i=1}^a \sum_{j=1}^a\sum_{k=1}^a [\gcd(i,j ... 
- [SDOI2013]项链
		description luogu 最近,铭铭迷恋上了一种项链.与其他珍珠项链基本上相同,不过这种项链的珠子却与众不同,是正三菱柱的泰山石雕刻而成的. 三菱柱的侧面是正方形构成的,上面刻有数字. 能够 ... 
- 洛谷 P3307: bzoj 3202: [SDOI2013] 项链
		题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ... 
- bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ... 
- 洛谷 P3307 - [SDOI2013]项链(Burnside 引理+数论)
		题面传送门 看到题目我们显然可以将题目拆分成两部分:首先求出有多少个符合要求的珠子 \(c\),这样我们就可以将每种珠子看成一种颜色,题目也就等价于有多少种用 \(c\) 种颜色染长度为 \(n\) ... 
- bzoj AC倒序
		Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ... 
随机推荐
- 部署LVS-NAT群集
			案例环境 LVS调度器作为Web服务器池的网关,LVS两块网卡,分别连接内外网,外网地址172.16.16.172.24,同时也作为整个群集的VIP,内网地址为192.168.7.21-24/24,是 ... 
- springMVC传递一组对象的接受方式
			受益此大神:https://blog.csdn.net/cgd_8523/article/details/80022331 同时借鉴代码!!!! 我只用了一种方法,就记下这一种 需求:前台存在动态添加 ... 
- python-requests库的使用之爬取贴吧内容并保存在本地
			以面向对象的程序设计方式,编写爬虫代码爬去‘李毅吧’所有页面的内容,也可以通过改变对象的参数来爬取其它贴吧页面的内容. 所用到的库为:requests 涉及知识点:python面向对象编程,字符串操作 ... 
- win10 安装 mysql 5.7
			win10 安装 mysql 5.7 1.在mysql 官网下载mysql 5.7 的手动安装包 mysql--winx64.zip 2. 解压到mysql 目录的文件夹下面 D:\moudle\my ... 
- PHPStudy环境下搭建composer
			第一种方法(亲测有效) 1. 找到composer的安装目录:D:\phpstudy\PHPTutorial\tools\composer 2.把目录下的 composer.bat 和 compose ... 
- JSP中使用JSTL表达式
			最近写web项目,为了使JSP代码美观好维护,决定采用EL&JSTL表达式. EL表达式直接就可以用,但是JSTL表达式是属于apache的一个开源库,这个用起来就需要倒入一些jar包之 ... 
- div实现高度自适应的textarea
			textarea使我们常常使用的一种表单形式,多用于大段文字的输入,大多数情况下,textarea都是可以满足需求的,但是当我们希望这个输入框高度自适应的时候,textarea就很难做到了. ok,主 ... 
- 当spring抛出异常时出现的页面的@ExceptionHandler(RuntimeException.class) 用法
			当spring抛出异常时出现的页面的@ExceptionHandler(RuntimeException.class) 用法 主要用在Controller层 @ExceptionHandler(Run ... 
- Scanner类中的nextToken()方法解读
			下面看一下nextToken()方法的源码实现. 1.Java中的控制字符 case ' ': // (Spec 3.6) case '\t': // (Spec 3.6) case FF: // ( ... 
- linux下的ps命令
			ps命令用于报告当前系统的进程状态.可以搭配kill指令随时中断.删除不必要的程序.ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程 ... 
