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以内的所 ...
随机推荐
- aes 解密出现 java.lang.NumberFormatException: Invalid int: "ch"
原因: 将加密/解密的seed 和 加密内容顺序放反. decrypt(String seed, String encrypted) 附上AES解密/加密代码(android开发): package ...
- python 链接hive
http://blog.csdn.net/xubcing/article/details/8350287 http://www.centoscn.com/python/2014/0921/3801.h ...
- HDU 4101 Ali and Baba
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4101 一看之下以为是博弈,后来分析才知道只是搜索题. 首先,我们需要从值为-1的位置由内向外搜索一次, ...
- 【单调栈】Bzoj 1012: 最大数maxnumber
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6255 Solved: 2676[Submi ...
- 【HDOJ】【2089】不要62
数位DP cxlove基础数位DP第一题 用容斥把所有的不吉利数字去掉就得到吉利数字的数量= =(满足区间减法) //HDOJ 2089 #include<cmath> #include& ...
- 20160722noip模拟赛alexandrali
[题目大意] 有许多木块, 叠放时, 必须正着叠放, 如图1, 左边两块为合法叠放, 右边为不合法叠放. 图1 一个方块被称为稳定的, 当且仅当其放在最底层, 或其正下方有方块且下方的这个方块的四周都 ...
- 【Memcache】下载和安装
下载: Win7 64bit 系统 下载过过很多版本,都无法安装,最后到这里下载,成功安装: http://blog.couchbase.com/memcached-windows-64-bit-pr ...
- Unity3D脚本中文系列教程(四)
http://dong2008hong.blog.163.com/blog/static/4696882720140302451146/ Unity3D脚本中文系列教程(三) 送到动画事件. ◆ va ...
- properties配置应用,为什么需要使用properties文件
在项目中我们常常会使用Constants常量类,达到系统全局配置的目的. 但是有些常量需要动态的配置,如果项目上线后,每次修改Constants.java然后再编译,再上传Constants.clas ...
- qsort()与besearch()
功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void ...