codeforces 900D 数论+组合+容斥原理
问有多少个这样的数字序列
所有数的GCD等于x 并且 所有数的和等于y
题解:
非常难有思路啊 看题解后过的。
考虑序列GCD为x的倍数 即GCD = n*x 和当然都为y 这个条件不要忘了
这样我们可以用 容斥原理来递推的计算GCD为n*x的序列个数是多少
怎么计算呢
以样例为例子 3 9
当GCD = 3 的时候 可以有9 / 3 = 3 个3 序列是这样的 3 3 3
那么有三个空 用插板法 可以计算可以插板的方式数位2**(3-1) = 2**2 = 4种
这里解释插板的意义 3|3 3插一个板就表示相邻的数求和 那么3|3 3 就是 6 3
同理 3 3|3 -> 3 6; 3|3|3 -> 9; 但是这样插板出现了问题 就是出现了GCD 并不为3的序列 即 9
这个时候就需要用容斥原理来 递推
设a[i] 表示GCD为i的序列个数, a[j] 表示GCD为j个数
不妨设i > j
if (i % j == 0) a[j] = (a[j]+MOD-a[i]) % MOD; 因为 GCD 为i的情况是一定可以通过插板 得到GCD 为j的情况
而通过从大到小的递推 a[i]已经是容斥后的结果
这样最终得到GCD最小为x 的结果就是答案 网上题解写的有点不太清楚 这里自己补充点自己的理解。轻喷。。
代码君:
#include <bits/stdc++.h>
#include <string.h>
#include <iostream>
#include <stdio.h>
#define pb push_back const int MOD = 1e9+;
const int MAXN = 1e5+;
typedef long long ll; using namespace std; ll x, y; ll mypow(ll base, ll p)
{
if (p == ) return ;
ll tmp = mypow(base, p/);
if (p & ) tmp = (tmp*tmp*base) % MOD;
else tmp = (tmp*tmp) % MOD;
return tmp;
}
vector<ll> a;
ll dp[MAXN];
int main()
{
//freopen("in.txt", "r", stdin);
while (cin >> x >> y)
{
a.clear();
if (y % x != )
{
cout << << endl;
continue;
}
for (ll i = ; i*i <= y; i++)
{
if (i % x == && y % i == ) a.pb(i);
if (i*i != y && y % i == && (y/i)%x== ) a.pb(y/i);
}
sort(a.begin(), a.end());
for (int i = ; i < a.size(); i++) dp[i] = mypow(, (y/a[i]-));
for (int i = (int)a.size()-; i >= ; i--)
for (int j = i+; j < a.size(); j++)
if (a[j] % a[i] == )
{
dp[i] -= dp[j];
dp[i] = (dp[i] + MOD) % MOD;
}
cout << dp[] << endl;
}
return ;
}
codeforces 900D 数论+组合+容斥原理的更多相关文章
- Codeforces 900D Unusual Sequences 容斥原理
题目链接:900D Unusual Sequences 题意: 给出两个数N,M.让你求数列(和为M,gcd为N)的个数. 题解: 首先,比较容易发现的是M%N如果不为零,那么一定不能构成这样的序列 ...
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
- [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)
[Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- Codeforces 451 E. Devu and Flowers(组合数学,数论,容斥原理)
传送门 解题思路: 假如只有 s 束花束并且不考虑 f ,那么根据隔板法的可重复的情况时,这里的答案就是 假如说只有一个 f 受到限制,其不合法时一定是取了超过 f 的花束 那么根据组合数,我们仍然可 ...
- CodeForces 300C --数论
A - A Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- CodeForces 359D (数论+二分+ST算法)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47319 题目大意:给定一个序列,要求确定一个子序列,①使得该子序 ...
- UVA 11806 Cheerleaders (组合+容斥原理)
自己写的代码: #include <iostream> #include <stdio.h> #include <string.h> /* 题意:相当于在一个m*n ...
- Codeforces 264B 数论+DP
题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...
随机推荐
- GitHub和码云的简单使用
年轻,又经历了初高大学的英语的纠缠,导致连最简单的语句都看不懂,我在慢慢寻找语言的快乐 GitHub 的简单使用 : https://www.cnblogs.com/zhcncn/p/3731707. ...
- 【转】再谈 最速下降法/梯度法/Steepest Descent
转载请注明出处:http://www.codelast.com/ 最速下降法(又称梯度法,或Steepest Descent),是无约束最优化领域中最简单的算法,单独就这种算法来看,属于早就“过时”了 ...
- NOIP模拟赛 路面修整
[题目描述] FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个 ...
- Bootstrap 模态框 select2搜索框无法输入
去掉模态框的div中的 tabindex="-1" 这个属性 <div class="modal fade" role="dialog" ...
- PHP做ERP, CRM, CMS系统需要注意哪些地方
php作为二次开发弱类型语言, 可读性, 可视度都是比较高的. 在很多人眼里, 也许php只能做一些web应用开发, 比如某个公司的网站, 某个公司的网站后台, 其实,我可以告诉大家, php不比任何 ...
- Python爬取全站妹子图片,差点硬盘走火了!
在这严寒的冬日,为了点燃我们的热情,今天小编可是给大家带来了偷偷收藏了很久的好东西.大家要注意点哈,我第一次使用的时候,大意导致差点坏了大事哈! 1.所需库安装 2.网站分析 首先打开妹子图的官网(m ...
- python中文件操作的六种模式及对文件某一行进行修改的方法
一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...
- LeetCode(224) Basic Calculator
题目 Implement a basic calculator to evaluate a simple expression string. The expression string may co ...
- Spring boot 中Spring data JPA的应用(一)
最近一直在研究Spring Boot,今天为大家介绍下Spring Data JPA在Spring Boot中的应用,如有错误,欢迎大家指正. 先解释下什么是JPA JPA就是一个基于O/R映射的标准 ...
- UML结构与解析——BUAA OO第四单元作业总结
UML与解析架构 UML是什么 统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编 ...