Problem - D - Codeforces

题意:给定一个数组a,该数组由ai=gcd(b1,b2,...,bi)生成而来,要求求出b数组的所有方案数。

ai<=m,bi<=m;

思路:对于每一个bi来说,他需要满足两个条件,gcd(bi,ai-1)==ai,gcd(bi/ai,ai-1/ai)==1,显然,当ai-1 % ai !=0时,答案就直接是0,无法生成。而bi 必须是ai的倍数的同时,取值于1 ~ m/ai中与ai-1/ai互质的数。

利用容斥原理,分解质因数,并对ai==ai-1的情况进行记录,限制时间复杂度,二进制枚举,除去所有因数

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#include<bitset>
#include<cmath>
#include<array>
#include<atomic>
#include<sstream>
#include<stack>
#include<iomanip>
//#include<bits/stdc++.h>#define int ll
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(0);
#define pb push_back
#define endl '\n'
#define x first
#define y second
#define Endl endl
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
#define si(x) scanf("%d", &x);
#define sl(x) scanf("%lld", &x);
#define ss(x) scanf("%s", x);
#define YES {puts("YES");return;}
#define NO {puts("NO"); return;}
#define all(x) x.begin(),x.end()using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
typedef pair<char, int> PCI;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<ll, ll> PLL;
const int N = 300010, M = 2 * N, B = N, MOD = 998244353;
const double eps = 1e-7;
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
//int dx[8] = { 1,2,2,1,-1,-2,-2,-1 }, dy[8] = { 2,1,-1,-2,-2,-1,1,2 };
int n, m, k;
int a[N];
int prime[N], countNum;
bool st[N];
int phi[N];
map<int, vector<int>> fact;ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); }
ll lowbit(ll x) { return x & -x; }
ll qmi(ll a, ll b, ll MOD) {ll res = 1;while (b) {if (b & 1) res = res * a % MOD;a = a * a % MOD;b >>= 1;}return res;
}inline void init() {for (int i = 2; i < N; i++){if (!st[i]) { prime[countNum++] = i; phi[i] = i - 1; }for (int j = 0; prime[j] < N / i; j++){st[prime[j] * i] = true;if (i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[i]] = phi[i] * (prime[j] - 1);}}
}vector<int>& getf(int x)
{if (fact.count(x))return fact[x];int t = x;for (int i = 0; i < countNum; i++){if (t % prime[i] == 0) {fact[x].push_back(prime[i]);}}if (t > 1) fact[x].push_back(t);
}bool isoddone(int x)
{int cnt = 0;for (int i = 0; i <= 30; i++){if (x >> i & 1) cnt++;}return cnt & 1;
}inline void slove()
{cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];int t = a[1];vector<int> p;for (int i = 2; i * i <= t; i++) {if (t % i == 0) {p.push_back(i);while (t % i == 0) t /= i;}}if (t > 1) p.push_back(t);int ans = 1;map<int, int> mp;for (int i = 2; i <= n; i++) {if (a[i - 1] % a[i]) {ans = 0;break;}if (a[i] == a[i - 1] && mp.count(a[i])) {ans = (ans % MOD * mp[a[i]]) % MOD;continue;}int t1 = m / a[i];int t2 = a[i - 1] / a[i];vector<int> f;for (auto x : p)if (t2 % x == 0) f.push_back(x);int res = 0;for (int j = 0; j < 1 << f.size(); j++) {int sign = isoddone(j) ? -1 : 1;int mul = 1;for (int k = 0; k < f.size(); k++)if (j >> k & 1) mul *= f[k];res += sign * t1 / mul;}res = (res % MOD + MOD) % MOD;ans = (ans % MOD * res) % MOD;if (a[i] == a[i - 1] && !mp.count(a[i])) {mp[a[i]] = res;}}cout << ans << '\n';
}signed main()
{//IOS;int _ = 1;si(_);init();while (_--){slove();}return 0;
}
/*
1
6 6
5 5 5 5 5 5*/

D. Count GCD相关推荐

  1. 【组合数学--容斥】CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!) D. Count GCD

    大概思路想出来了,就差不会写容斥了.... 题意: 思路: 这是一开始的思路: 推到最后就是求在区间[1,m/a[i+1]中有多少k2满足以下条件,gcd(k1,k2)=1,k1是一个定值 这就是容斥 ...

  2. MaciOS之多线程(转)

    转自 https://github.com/kejinlu/objc-doc/blob/master/%E5%A4%9A%E7%BA%BF%E7%A8%8B.md#macios%E4%B9%8B%E5 ...

  3. 容斥原理之求区间中与某数互质的个数

    一,定义 为了计算时不重不漏,就要不断加减重复部分 观察到:即奇数长度的前面是加号,偶数长度的为减号 二,思路:我们这里可以通过求不互质的数,自然就能得出互质的数,求不互质比较简单(因为他们是目标的质 ...

  4. 关于求1~n中与m互质的数的个数(容器原理+数论分解质因子)

    D. Count GCD 这道题严格来讲不难,a[i]与b[i+1]最大公约数为a[i+1],所以a[i]与b[i+1]必定整除a[i+1],且a[i]/a[i+1]与b[i+1]/a[i+1]互质, ...

  5. java实现第五届蓝桥杯幂一矩阵

    幂一矩阵 天才少年的邻居 atm 最近学习了线性代数相关的理论,他对"矩阵"这个概念特别感兴趣.矩阵中有个概念叫做幂零矩阵.对于一个方阵 M ,如果存在一个正整数 k 满足 M^k ...

  6. iOS个人整理33-GCD----多线程优化

    一.GCD GCD(Grand Central Dispatch)是Apple开发的一种多核编程技术.主要用于优化应用程序以支持多核处理器 GCD提供函数实现多线程开发,性能更高,功能更强大 首次发布 ...

  7. 网易笔试题——骰子游戏

    网易试题 小易参加了一个骰子游戏,这个游戏需要同时投掷n个骰子,每个骰子都是一个印有数字1~6的均匀正方体. 小易同时投掷出这n个骰子,如果这n个骰子向上面的数字之和大于等于x,小易就会获得游戏奖励. ...

  8. C++旋转数组(三种解法详解)

    题目链接:旋转数组 题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 附加要求 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 ...

  9. GCD之信号量机制二

    在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明. 1.下面是不采用信号量修改公有变量的值 dispatch_grou ...

  10. 多线程编程 - GCD

    一.简介 在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是苹果公司为多核的并行运算提出的解决方案.GCD在工作时会自动利用更多的处理器核心,以充分利用更强大的机器.GCD是Gr ...

最新文章

  1. PHP报“Cannot start session without errors”
  2. Swift标准库源码阅读笔记 - Array和ContiguousArray
  3. 程序包不存在?无源文件?找不到文件?找不到或无法加载主类?
  4. nyist 一笔画问题
  5. 微软Silverlight,你应该知道的10件事
  6. 校门外的树——树状数组+区间修改
  7. 接到骗子短信后........
  8. 使用扩展存储过程xp_regread读取注册表信息
  9. matlab中对正弦信号采样,正弦信号抽样的实验报告(共9篇).doc
  10. LeetCode 515. Find Largest Value in Each Tree Row
  11. Flex读取非UTF-8中文数据乱码问题的解决方案
  12. AD09 PCB设计中频繁弹出“undeclared identifier........“
  13. python微服务开发pdf_微服务架构实战 中文pdf完整版[207MB]
  14. spyder安装pyqt5
  15. 视频黑屏检测,时长检测 blackdetect
  16. 偏导数与全导数的关系 以及 偏微分与全微分的关系
  17. 通过SQL注入获得网站后台用户密码
  18. MySQL常见运算符详解
  19. 台式机和计算机有什么区别,笔记本电脑和台式电脑有什么区别
  20. “GitHub: Your account has been flagged.”的解决方法

热门文章

  1. 【语义分割】 DRANet Scene Segmentation With Dual Relation-Aware Attention Network
  2. 基因家族分析-蛋白互作网络分析
  3. Java电子签章验章知识储备
  4. 用PS制作GIF动图
  5. 资源池以及资源池化是什么意思?
  6. Mybatis事务隔离级别
  7. Easyui--官网
  8. git/gitgub
  9. axios post方式同时传递pram和json参数
  10. 大数据查询与处理Pig培训:大数据查询处理技术解析