【TCO2A ThePowers】容斥原理

Description

对于  ,问   的不同结果数。

Difficulty

MainAlgorithm

容斥原理

Complexity

Solution

考虑两个数的次幂得到了相同结果,

.
则  . 故   是一个整数。同理可证   是一个整数。
那么 
我们发现,只有有着共同的   的数才会产生冲突。而且冲突的数量与   无关。只与最大的   的次数有关。我们预处理出来拥有   次的   能产生的贡献。
即   的不同答案数。其中  .
那么就变为   的不同答案数。
由于不同的 x 能达到的数不同,为了方便处理,我们分别处理   中的数个数。这部分需要考虑的是   对这段区间的覆盖。
注意到假如   是   的约数,  能覆盖到的点   全能覆盖到,故   中(通过搜索发现)去重后最多只有 15 个元素。
那么通过容斥暴力把这部分算出来。
再从   枚举到  ,把答案统计出来就好。 --------    以上转自picks

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define Rep(i, x, y) for (int i = x; i <= y; i ++)
#define Dwn(i, x, y) for (int i = x; i >= y; i --)
#define RepE(i, x) for(int i = pos[x]; i; i = g[i].nex)
using namespace std;
typedef long long LL;
const int mx = 30, M = 50;
class ThePowers {
public:
	LL f[M], ans, ql, qr, u[M], uz, A, B;
	int qk;
	LL gcd(LL x, LL y) {
		return !y ? x : gcd(y, x % y);
	}
	void Dfs(int x, LL lm, int o, int t) {
		if (x == uz + 1) {
			if (!t) return ;
			LL ret = qr / lm - (ql-1) / lm;
			f[qk] += ret * o;
			return ;
		}
		Dfs(x + 1, lm * u[x] / gcd(lm, u[x]), o * (-1), t + 1);
		Dfs(x + 1, lm, o, t);
	}
	LL find (int A0, int B0) {
		A = A0, B = B0;
		for (qk = 1; qk <= mx; qk ++) { // prepare to all the g^k 's k ..
			Rep(i, 1, qk) {
				ql = (i - 1) * B + 1, qr = i * B, uz = 0;
				Rep(j, i, qk) {
					bool fl = 0;
					Rep(o, i + 1, j - 1) if (j % o == 0) fl = 1;
					if (!fl) u[++ uz] = j;
				}
				Dfs(1, 1, -1, 0);
			}
		}
		LL la = A - 1;
		for (int i = 2; i * i <= A; i ++) {
			int k = i, o, g0 = 0;
			for (int j = 2; j * j <= k; j ++) {
				o = 0;
				while (k % j == 0) o ++, k /= j;
				if (o) g0 = gcd(g0, o);
			}
			if (k > 1) g0 = 1;
			if (g0 <= 1) {
				int r = 1; LL k = i;
				while (k * i <= A) r ++, k *= i;
				ans += f[r];
				la -= r;
			}
		}
		return ans + 1 + la * B;
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值