UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51196
紫书P320;
题意:给定n个数a1,a2····an,依次求出相邻两个数值和,将得到一个新数列,重复上述操作,最后结果将变为一个数,问这个数除以m的余数与那些数无关?例如n=3,m=2时,第一次得到a1+a2,a2+a3,在求和得到a1+2*a2+a3,它除以2的余数和a2无关。1=<n<=10^5, 2=<m<=10^9
其实就是杨辉三角的某一行有几个能整除m,求C(0,n - 1),C(1, n - 2)... C(n - 1, n - 1)中那几个能整除m
解题思路:
1、首先我们可以发现对于给定的n其实每项的系数就是C(n-1,i-1),所以我们只需要找到每项的系数对m取余是否为0即可
2、由于m的取值范围为10^9,所以我们只需要筛选 √(10^9)的素数,然后对m进行分解;如果分解后m>1,说明当前m的是原m的一个素数,而且m> √(10^9),因此我们只需记录它即可
3、由组合数的递推公式C(k, n) = (n - k + 1) / k * C(k - 1, n),而这道题n = n - 1;首项是一,可以直接从第二项即k = 1: (n - 1 ) - k + 1 / k开始判断是否能整除m,分子能整除素数元素个数就减一,分母能整除就+1,如果对于任意一个素数对应的指数 >= 1,就说明不能整除
收获:
每个整数的唯一分解式项数不多(long long 类型的数值最多20项,前21个素数相乘long long就溢出了)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int Max = ; int factor[],nfactor[],num_factor,flag_factor[ + ];
int count_prime,prime[Max + ],flag[Max + ];
void get_prime()
{
memset(flag, , sizeof(flag));
count_prime = ;
for(int i = ; i <= Max; i++)
{
if(flag[i] == )
{
flag[i] = ;
prime[++count_prime] = i;
for(int j = ; j <= Max / i; j++)
{
flag[i * j] = ;
}
}
}
} void get_factor(int m)
{
num_factor = ;
memset(nfactor, , sizeof(nfactor));
memset(factor, , sizeof(factor));
for(int i = ; i <= count_prime; i++)
{
if(m < prime[i])
break;
if(m % prime[i] == )
{
factor[num_factor] = prime[i];
while(m % prime[i] == && m)
{
nfactor[num_factor]++;
m = m / prime[i];
}
num_factor++;
if(m == || m == )
break;
}
}
if(m > )
{
factor[num_factor] = m;
nfactor[num_factor]++;
num_factor++;
}
}
bool check(int x, int y)
{
bool check_flag = true;
for(int i = ; i < num_factor; i++)
{
while(x % factor[i] == && x)
{
x = x / factor[i];
nfactor[i]--;
}
while(y % factor[i] == && y)
{
y = y / factor[i];
nfactor[i]++;
}
if(nfactor[i] >= )
{
check_flag = false;
//break; 要不得,即使不能整除,也要约分完,因为下一个受这一个的影响
}
}
return check_flag;
}
int main()
{
int n,m;
get_prime();
while(scanf("%d%d", &n, &m) != EOF)
{
get_factor(m); //对m分解
int cnt = , ends = ;
memset(flag_factor, , sizeof(flag_factor));
for(int i = ; i <= n; i++)
{
if( check(n - i, i) ) //原型就是 (n - 1 - i + 1) / i
{
flag_factor[i + ] = ;
ends = i + ;
cnt++;
}
}
printf("%d\n", cnt);
if(cnt > )
{
for(int i = ; i < ends; i++)
if(flag_factor[i])
printf("%d ", i);
printf("%d", ends);
}
printf("\n");
}
return ;
}
UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)的更多相关文章
- UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理
题目链接:https://vjudge.net/problem/UVA-1635 (紫书320) 题解: 1.根据二项式定理, 可得递推公式: C(n,k) = (n-k+1)/k * C(n, k- ...
- 【UVa1635】Irrelevant Elements - 唯一分解定理
题意 给你 \(n\) 个数,每次求出相邻两个数的和组成新数列.经过 \(n-1\) 次操作后,得到一个数.求这个数 \(mod \ m\) 与哪些项无关. 如:当 \(m=2 \ , \ n=2\) ...
- POJ2167Irrelevant Elements[唯一分解定理 组合数 杨辉三角]
Irrelevant Elements Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2407 Accepted: 59 ...
- hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)
GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- loj #6261 一个人的高三楼 FFT + 组合数递推
\(\color{#0066ff}{ 题目描述 }\) 一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静. 不过,\(HSD\) 桑还有一些作业没有完成,他需要在这个晚自习写完.比如这道数学题: ...
- UVa1635 - Irrelevant Elements
通过观察发现其规律符合杨辉三角 需要注意的是最后ai的系数是C(i-1,n-1) 那么,问题就可以变成判断C(0,n-1),C(1,n-1)....C(n-1,n-1)哪些是m的倍数 只需要计算出m的 ...
- Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推
https://codeforces.com/contest/1330/problem/D 给出d,m, 找到一个a数组,满足以下要求: a数组的长度为n,n≥1; 1≤a1<a2<⋯&l ...
- CTU Open 2018 Lighting /// 组合数递推 二进制
题目大意: 给定n k 给定一个数的二进制位a[] 求这个数加上 另一个二进制位<=n的数b 后 能得到多少个不同的 二进制位有k个1 的数 样例 input10 51000100111 out ...
- UVa 10253 (组合数 递推) Series-Parallel Networks
<训练之南>上的例题难度真心不小,勉强能看懂解析,其思路实在是意想不到. 题目虽然说得千奇百怪,但最终还是要转化成我们熟悉的东西. 经过书上的神分析,最终将所求变为: 共n个叶子,每个非叶 ...
随机推荐
- where,having与 group by连用的区别
select 列a,聚合函数 from 表名 where 过滤条件 group by 列a having 过滤条件 group by 字句也和where条件语句结合在一起使用.当结合在一起时,wher ...
- swift第二季高级语法
一.类和结构体 二.属性 三.方法 四.下标 五.继承和扩展 六.初始化和反初始化
- javascript模块化详解
模块化:每个模块只完成一个独立的功能,然后提供该功能的接口.模块间通过接口访问.模块中的(过程和数据)对于其它模块来说是私有的(不能访问修改) 原始人写法: function m1(){ //... ...
- ORA-00911: 无效字符
思路:遇到这样问题首先第一步:将有误sql粘至数据库运行一下,如果报错,说明sql存在问题. 第二步:数据库没问题.那么就要想你的书写方式是否正确,是否是ibatasi里的写法,或许是多了个 : 或 ...
- protobuf 文件级别优化
package IM.BaseDefine;option java_package = "com.mogujie.tt.protobuf";option optimize_for ...
- Java学习笔记(六)——google java编程风格指南(下)
[前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- [BZOJ 1085][SCOI2005]骑士精神(IDA*)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...
- [USACO2003][poj2112]Optimal Milking(floyd+二分+二分图多重匹配)
http://poj.org/problem?id=2112 题意: 有K个挤奶器,C头奶牛,每个挤奶器最多能给M头奶牛挤奶. 每个挤奶器和奶牛之间都有一定距离. 求使C头奶牛头奶牛需要走的路程的最大 ...
- Coding the Matrix (3):矩阵
1. 矩阵与映射 矩阵和映射包含两方面的关系: 简单:已知矩阵 M, 从向量 x 映射到 M * x. (注:矩阵与行向量的点乘) 稍微复杂:已知映射 x ->M * x, 求矩阵 M. 第一种 ...