【GDOI2016模拟3.16】幂
  • \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数.

  • \(A,B\)都是\(10^9\)级别.

  • 然后我们开搞.

  • 首先,假设一个合法的\(x\)可以表示为\(x=\prod p_i^{q_i}\),那么令\(d=gcd(q_1,q_2...q_k)\)

  • 假设\(d>1\),显然我们不需要单独考虑,因为它可以继续化简,我们找到最简的那个数然后去一次性处理.

  • 那么此时所有情况都变成了\(d=1\).

  • 此时再分两种情况讨论,因为我们现在实际上把问题转化为了:

    \(x\in[1,A]\),\(y\in [1,B]\),求\((c^x)^y\)的不同个数.

  • 然后这个问题显然当\(x>\sqrt{A}\)时贡献就是\(B\)。

  • 所以题目转化为:

    在\(x\in[1,\sqrt{A}],y\in[1,B]\)时,\((c^x)^y\)的不同个数.

  • 于是我们可以正难则反,计算一下不合法的个数,假设\(k={log_x}^n\),那么问题又可以转化为:

    \(x\in[1,k],y\in[1,B]\),\(xy\)的相同个数.

  • 于是这个问题值得思考一下.

  • 咱有一个经典套路:分块计算;

  • 即把总范围\([1,KB]\)变成\(K\)块,每一块都长的像这样的形式:

\[[(i-1)B+1,iB] | (1\le i \le K)\]

  • 那么现在单独考虑每一块的贡献.

  • 然后假设我们现在处理第\(i\)个块,那么如果其中某一个数可以被表示为\(x*y\)的形式.

  • 则必定存在一个\(d\in [i,k]\),满足\(d|x*y\).

  • 因为这样子就必定能满足\(x\in [1,K],y\in [1,B]\)这两个条件.

  • 所以现在题目再次被转化:

    等价于我们要求在区间\([(i-1)B+1,iB]\)范围内有多少个数是\([i,k]\)区间中某一个数的倍数.

  • 这次转化以后我们发现问题就变得熟悉了...

  • 因为\(B\)比较大,\(k\)貌似小,所以,,,, 这TM容斥一下不就好了??

  • 但是,我们发现,\(k\)最大可能为\(30\),这意味着,\(2^{30}\)是接受不了的...

  • 但是我们很容易想到,如果当乘上一个数的lcm没有变化之后,就不需要去弄.

  • 这样子的话时间一下子就降了下来,反正怎么打都能过~

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>#define ll long long
#define F(i, a, b) for (ll i = a; i <= b; i ++)
#define sqr(x) ((x) * (x))const ll N = 5e5;ll ans, sum;ll A, B, up, P[N];bool vis[N];using namespace std;void Init() {#ifndef ONLINE_JUDGEfreopen("data.in", "r", stdin);#endifscanf("%lld%lld", &A, &B);up = int(sqrt(A)) + 1;ans = 1LL * (A - 1) * B + 1;
}void GetPrime() {F(i, 2, N - 1) {if (!vis[i])P[++ P[0]] = i;F(j, 1, P[0]) {if (P[j] * i >= N) break;vis[P[j] * i] = 1;if (i % P[j] == 0) break;}}
}ll gcd(ll x, ll y){return y == 0 ? x : gcd(y, x % y);
}void dfs(ll x, ll v, ll st, ll en, ll g, ll k) {if (x > k) {sum += 1LL * (en / v - st / v) * g;return;}if (x != gcd(v, x)) {dfs(x + 1, v * x / gcd(v, x), st, en, g * (- 1), k);dfs(x + 1, v, st, en, g, k);}
}ll Solve(ll x) {ll cnt = -1;for (ll tmp = 1; tmp <= A; tmp *= x, cnt ++);sum = 0;F(i, 2, cnt)dfs(i, 1, (i - 1) * B, i * B, 1, cnt);return sum;
}void Doit() {F(i, 2, up) {ll tmp = i, yes = 0;F(j, 1, P[0]) {if (sqr(P[j]) > i) break;ll cnt = 0;while (tmp % P[j] == 0) tmp /= P[j], cnt ++;yes = gcd(yes, cnt);if (yes == 1) break;}if (tmp > 1 || yes == 1)ans -= Solve(i);}printf("%lld\n", ans);
}int main() {Init();GetPrime();Doit();
}

转载于:https://www.cnblogs.com/Pro-king/p/9383457.html

【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)相关推荐

  1. GDOI2016模拟8.16帮派

    农场里的生活很艰苦,而且当生活很艰苦,你必须坚强起来.奶牛们形成了编号为1到M的帮派.这些帮派一开始和睦相处了一段时间,但是现在失控了! 奶牛们在竞争一片大草地的控制权.奶牛之间的冲突发生在连续的若干 ...

  2. [2021.1.27多校省选模拟10]染色(min-max容斥/二项式反演)

    [2021.1.27多校省选模拟10]染色 突然发现我对概率期望的理解不是很好... 部分分1:可以直接进行状压dp,然后按照题意模拟即可. 部分分2:首先可以发现这个问题是min_max容斥形式,然 ...

  3. 【cogs2593】幂,暴搜+容斥

    传送门 思路: 这个题搞了好几天,终于卡过去了,但我的做法并不是特别正规,如果大家想了解更加科学的做法,可以去TA爷的51nod题解 说一下部分分好了: 10分随便做 30分我们可以把每一个x(x∈[ ...

  4. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)...

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  5. 20200515省选模拟赛B、幻化成风(毒瘤容斥题+构造容斥系数+生成函数+hash状压DP+Trie树优化背包)

    题解 花了一上午+一中午终于把这道题A了 首先,我们要求的是bi互不相同的合法方案数 我们可以枚举一个a的集合S,来强制里面的b全部都相同,然后其它的随便放 由于这个题的n的约数非常多,我们可以把它质 ...

  6. [2020.11.3NOIP模拟赛]选数字【容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/U138404?contestId=36493 题目大意 nnn个数字,每次询问一个区间有多少个三对数或为xxx. 解 ...

  7. jzoj3170-[GDOI2013模拟4]挑选玩具【容斥,状态压缩,分治】

    正题 题目大意 有nnn个箱子放了若干个玩具,要求选择一些箱子使得mmm种玩具都有,求方案总数. 解题思路 设fSf_SfS​表示选择只有在集合为SSS的方案数. 然后答案考虑容斥,那么答案就是∑S( ...

  8. Killer Names( 容斥定理,快速幂 )

    题目大意: m种不同颜色的球,填两组盒子,每组盒子有n个,两组盒子中不能有相同颜色的球,问方法总数有多少. 解题思路:利用容斥定理,m种颜色放入n个格子共有m^n个,但其中肯定有不满足m种颜色的,所以 ...

  9. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

最新文章

  1. chubby分布式锁服务概述
  2. 自定义dropout
  3. Ubuntu14.04更新源
  4. WebApi服务监控 log4net记录监控日志
  5. boost::hana::eval_if用法的测试程序
  6. IE的2像素偏差问题终于“将要”成为历史了(附js微技巧一则)
  7. python——闭包与闭包中修改外部变量
  8. java jmenuitem重新渲染_的Java的JMenuItem添加邊框的第二菜單項
  9. CentOS7安装EPEL源
  10. Android 音频开发(三) 如何播放一帧音频数据上
  11. 在 Mac 上的 Pages 文稿中如何添加和替换文本?
  12. C语言从入门到精通需要多久?你真的知道吗!
  13. Android 手机 超级终端命令解析
  14. URL转换成IP的过程
  15. 远程办公软件:TeamViewer使用评测与安装
  16. np.array_split()np.split()
  17. vue做移动端适配最佳解决方案,亲测有效
  18. 常见的python与爬虫面试题准备好了
  19. xlsx文件打不开损坏要如何恢复呢?
  20. python项目对接钉钉SDK

热门文章

  1. js实现随机选取[10,100)中的10个整数,存入一个数组,并排序。 另考虑(10,100]和[10,100]两种情况。...
  2. java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException 异常解决方案
  3. (笔试题)不用除法操作符,实现两个整数的除法
  4. 实现JDK没有提供的AtomicFloat
  5. XAML Region标签功能
  6. Siege 3.0 Beta2 发布,压力测试工具
  7. numpy找到数组中符合条件的数
  8. CPLD/FPGA的UART接口设计之系统时钟(晶振)和波特率关系
  9. C++中的const成员函数介绍
  10. python map()函数