UVa 1635 (唯一分解定理) Irrelevant Elements
经过紫书的分析,已经将问题转化为求组合数C(n-1, 0)~C(n-1, n-1)中能够被m整除的个数,并输出编号(这n个数的编号从1开始)
首先将m分解质因数,然后记录下每个质因子对应的指数。
由组合恒等式,我们可以递推C(n, k)的质因数的个数。
一个没什么用的小优化:因为杨辉三角每一行都是对称的,所以我们可以求出前一半答案,然后根据对称性求出后一半的答案。
需要注意的是,如果答案中有类似C(10, 5)的数,就不要再对称了,会重复的。
这个优化貌似也只能优化0.05s左右。
#include <cstdio>
#include <cstring>
#include <cmath> const int maxn = + ;
int prime[maxn], bad[maxn], e[maxn], ans[maxn];
int p_cnt; void prime_factors(int n)
{
p_cnt = ;
int m = floor(sqrt(n) + 0.5);
for(int i = ; i <= m; ++i)
{
if(n % i == ) { prime[p_cnt++] = i; }
while(n % i ==) { e[p_cnt-]++; n /= i; }
}
if(n > )
{
prime[p_cnt] = n;
e[p_cnt++] = ;
}
} int main()
{
int n, m;
while(scanf("%d%d", &n, &m) == )
{
memset(prime, , sizeof(prime));
memset(bad, , sizeof(bad));
memset(ans, , sizeof(ans));
memset(e, , sizeof(e));
n--; prime_factors(m);
for(int i = ; i < p_cnt; ++i)
{
int p = prime[i];
int need = e[i];
int cur_e = ;
for(int k = ; k <= n/; ++k)
{
int x = n - k + ;
while(x % p == ) { cur_e++; x /= p; }
x = k;
while(x % p == ) { cur_e--; x /= p; }
if(cur_e < need) bad[k] = ;
}
} int ans_cnt = ;
for(int k = ; k <= n/; ++k)
if(!bad[k]) ans[ans_cnt++] = k;
if(ans_cnt)
{
int p = ans_cnt-;
if(ans[p] * == n) p--;
for(int i = p; i >= ; i--)
ans[ans_cnt++] = n - ans[i];
printf("%d\n", ans_cnt);
printf("%d", ans[] + );
for(int i = ; i < ans_cnt; ++i) printf(" %d", ans[i] + );
}
else puts("");
printf("\n");
} return ;
}
代码君
UVa 1635 (唯一分解定理) Irrelevant Elements的更多相关文章
- UVa 10375 (唯一分解定理) Choose and divide
题意: 求组合数C(p, q) / C(r, s)结果保留5为小数. 分析: 先用筛法求出10000以内的质数,然后计算每个素数对应的指数,最后再根据指数计算答案. #include <cstd ...
- UVA 10791 -唯一分解定理的应用
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> ...
- UVA - 11388 唯一分解定理
题意:给出G和L,求最小的a使得gcd(a,b)=G,lcm(a,b)=L 显然a>=G,所以a取G,b要满足质因子质数为L的同次数,b取L //此处应有代码
- UVA - 10780 唯一分解定理
白书P171 对m,n!分解,质因子指数取min #include<iostream> #include<algorithm> #include<cstdio> # ...
- Irrelevant Elements UVA - 1635 二项式定理+组合数公式+素数筛+唯一分解定理
/** 题目:Irrelevant Elements UVA - 1635 链接:https://vjudge.net/problem/UVA-1635 题意:給定n,m;題意抽象成(a+b)^(n- ...
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- UVA.10791 Minimum Sum LCM (唯一分解定理)
UVA.10791 Minimum Sum LCM (唯一分解定理) 题意分析 也是利用唯一分解定理,但是要注意,分解的时候要循环(sqrt(num+1))次,并要对最后的num结果进行判断. 代码总 ...
- POJ2167Irrelevant Elements[唯一分解定理 组合数 杨辉三角]
Irrelevant Elements Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2407 Accepted: 59 ...
- UVA 10375 Choose and divide【唯一分解定理】
题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所 ...
随机推荐
- 关于JS的一些代码效果图
关于JS的一些代码效果图 1.几乎所有DOM元素都有innerText.innerHTML属性(注意大小写),分别是元素标签内内容的文本表示形式和HTML源代码,这两个属性是可读可写的. 需要注意的是 ...
- 项目中的libevent
单线程libevent模式 项目里面是多线程版的,我先理解下单线程的. //client .调用NGP::init() bool NGP::init(NGPcontext context) { _co ...
- asp.net 获取客户机IP地址
/// <summary> ///get client IP /// </summary> /// <returns></returns> public ...
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) 分类: ORACLE 数据库 2011-05-24 16:39 8427人阅读 评论(2) 收藏 举报 oracledel ...
- zoj 3232 It's not Floyd Algorithm(强联通分量,缩点)
题目 /******************************************************************/ 以下题解来自互联网:Juny的博客 思路核心:给你的闭包 ...
- hadoop:could only be replicated to 0 nodes, instead of 1
在Hadoop的环境搭建过程中,常常会遇到类似这样的错误信息提示:“could only be replicated to 0 nodes, instead of 1 ”,产生这样的错误原因有多种,这 ...
- lintcode:Flip Bits 将整数A转换为B
题目: 将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 样例 如把31转换为14,需要改变2个bit位. ()10=()2 ()10=()2 挑战 你能想出几种方法? 解题: A- ...
- [hackerrank]The Love-Letter Mystery
https://www.hackerrank.com/contests/w3/challenges/the-love-letter-mystery 简单题. #include <cstdlib& ...
- SRAM与SDRAM的区别
http://www.cnblogs.com/spartan/archive/2011/05/06/2038747.html SDRAM SDRAM(Synchronous Dynamic Rando ...
- IT讲师韩顺平:我为什么辞去百万年薪,自己创业?
先自我介绍一下,我叫韩顺平,是一名IT讲师.国内很多自学PHP和Java的朋友都看过我的视频课程,算是有些知名度. 15年8月从传智辞职后,很多朋友非常关心我的去向,网上也流传各种说法,有的说我和某某 ...