Irrelevant Elements UVA-1635 (二项式定理)
乍一看似乎没什么思路,但是写几个简单的例子之后规律就变得很明显。
比如当 n=5 时,每一步计算后的结果如下:
a1
a1+a2
a1+2a2+a3
a1+3a2+3a3+a4
a1+4a2+6a3+4a4+a5
显然系数“1, 4, 6, 4, 1”就是杨辉三角第五行。
故某一项的系数是否是题中 m 的倍数,就决定了最终得到的数除以 n 的余数和那一项是否有关。
二项式定理:

从中很容易得到前后两项的关系 C(n, k)=(n-k+1)/k*C(n, k-1) 。但是单纯用这个公式暴力得到每个系数一定会导致溢出,故需要运用唯一分解定理分别存储每个系数的素因数和指数。
一般的代码不难给出,但是一直TLE。最后发觉应该先分解 m ,再得到 m 的素因数在各个 C(n,k) 中的指数,若指数过小则可以提前结束当前的分解。由于 m>1 ,可以忽略 nk 和 n0 的情况。
我的 AC 代码如下,最初是用 ANSI C 写的,一步一步改过来,故非常不简洁。其中用 map 存储素因数,其中元素 -1 用来作为该项是否能被 m 整除的 flag。
/*
*lang C++ 5.3.0
*user Weilin_C
*/
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <sstream>
#include <vector>
#include <map>
//#include <unordered_map>
#include <set>
#include <list>
#include <queue>
//每个数用map分质因数存储
//质数用素数筛 2-1000000000, MAXM=1000000
#define MAXM 1000000
#define MAXN 100000+5
using namespace std;
map <int, int> sta[MAXN], mm;
int pos[MAXN];
int prime[MAXM+1];
void mtomap (map<int, int> *ma, int n, int p)
{ //解码m n: 解码的数 p: 数n的个数
int num=n;
for (int i=2; i<=MAXM && num>0; i++) {
if (!prime[i]) {
while (num%i==0 && num>0) {
num/=i;
(*ma).insert(pair<int, int>(i, 0));
(*ma)[i]+=p;
}
}
}
if (num>1) (*ma).insert(pair<int, int>(num, 1));
return;
}
void ntomap (map<int, int> *ma, int n, int p)
{ //用于逐个解码第n行的杨辉三角 n: 解码的数 p: 数n的个数
map <int, int>::iterator it;
int num=n, t;
if (n<2) return;
for (it=mm.begin(); it!=mm.end(); it++) {
t=it->first;
if (t<2) continue;
(*ma).insert(pair<int, int>(t, 0));
while (num%t==0 && num>0) {
num/=t;
(*ma)[t]+=p;
}
if ((*ma)[t]<it->second) (*ma)[-1]=0;
}
return;
}
int judge(map<int, int> *ma)
{ //是否为0或1
int flag=0;
map <int, int>::iterator it;
for (it=(*ma).begin(); it!=(*ma).end(); it++)
if (it->second!=0 && it->first!=-1) {
flag=1;
break;
}
return flag;
}
int main()
{
int m, n;
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
/* C(n, k) = (n-k+1)/k * C(n, k-1) */
for (int i=2; i<=sqrt(MAXM+1); i++) {
if (prime[i]) continue;
for (int j=i+i; j<=MAXM; j+=i) prime[j]=1;
}
while (scanf("%d%d", &n, &m)==2) { //n: 杨辉三角层数
//printf("%d %d\n", n, m);
for (int i=0; i<=n; i++) if (!sta[i].empty()) sta[i].clear();
mm.clear();
sta[0][m]=0;
sta[0][-1]=0;
mtomap(&mm, m, 1);
map <int, int>::iterator it;
for (int i=1; i<n; i++) {
for (it=sta[i-1].begin(); it!=sta[i-1].end(); it++) sta[i][it->first]=it->second;
sta[i][-1]=1;
ntomap(&sta[i], n-i, 1);
ntomap(&sta[i], i, -1);
}
pos[0]=0;
int ans=0;
for (int i=0; i<n; i++) {
if (sta[i][-1] && judge(&sta[i])) {
ans++;
pos[++pos[0]]=i+1;
}
}
printf("%d\n", ans);
int f=0;
for (int i=1; i<=pos[0]; i++) {
if (f) putchar(' ');
else f=1;
printf("%d", pos[i]);
}
putchar('\n');
}
return 0;
}
by SDUST weilinfox
本文链接:https://www.cnblogs.com/weilinfox/p/12241600.html
Irrelevant Elements UVA-1635 (二项式定理)的更多相关文章
- Irrelevant Elements UVA - 1635 二项式定理+组合数公式+素数筛+唯一分解定理
/** 题目:Irrelevant Elements UVA - 1635 链接:https://vjudge.net/problem/UVA-1635 题意:給定n,m;題意抽象成(a+b)^(n- ...
- UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理
题目链接:https://vjudge.net/problem/UVA-1635 (紫书320) 题解: 1.根据二项式定理, 可得递推公式: C(n,k) = (n-k+1)/k * C(n, k- ...
- UVa 1635 - Irrelevant Elements-[分解质因数]
Young cryptoanalyst Georgie is investigating different schemes of generating random integer numbers ...
- POJ2167 Irrelevant Elements
Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Description Young cryp ...
- POJ 2167 Irrelevant Elements 质因数分解
Irrelevant Elements Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2231 Accepted: 55 ...
- UVa 1635 - Irrelevant Elements(二项式系数 + 唯一分解定理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 1635 (唯一分解定理) Irrelevant Elements
经过紫书的分析,已经将问题转化为求组合数C(n-1, 0)~C(n-1, n-1)中能够被m整除的个数,并输出编号(这n个数的编号从1开始) 首先将m分解质因数,然后记录下每个质因子对应的指数. 由组 ...
- UVA 1635 Irrelevant Elements
https://vjudge.net/problem/UVA-1635 题意:n个数,每相邻两个求和,最后变成1个数,问这个数除m的余数与第几个数无关 n个数使用次数分别为C(n-1,i) i∈[0, ...
- UVa 1635 无关的元素(唯一分解定理+二项式定理)
https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除 ...
随机推荐
- 一个简单的Web服务器-支持静态资源请求
目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...
- 一个APP从启动到主页面显示经历了哪些过程?
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求: ②system_server进程接收到请求后,向zygote进程 ...
- Python5_学习方法论
学习路线: 1.对基础知识的全面掌握,熟悉IDE和基本概念,注重知识体系构建: 2.开发实战.在该过程中掌握各类框架知识.熟悉模块的使用.并根据问题深入学习: ==================== ...
- Centos7源码编译安装mysql8
前面介绍了很多关于mysql的文章,下面主要介绍一下mysql8的源码编译安装 一 基本环境 [root@CentOS-7-x86-64-Minimal-1810 ~]# cd /usr/local/ ...
- 通过脚本实现对web的健康检查
前面的文章中(https://www.cnblogs.com/zyxnhr/p/10707932.html),通过nginx的第三方模块实现对web端的一个监控,现在通过一个脚本实现对第三方的监控 脚 ...
- MediatorPattern(中介者模式)-----Java/.Net
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式.
- 听说你的 IDEA 昨天掉链子了?松哥给你准备了大招
昨天一直在忙,中午抽空瞅了一眼技术群,天呐,竟然都在切磋 IDEA 激活码的事情,瞬间明白可能 jetbrains 又在搞事情了. 我大概了解了下,这次出事的主要是 2019 版,之前的 2018 版 ...
- vue 源码 学习days8-比较两个对象的方法
// 在面试中可能会遇到, 思想重要 // 比较两个对象是否是相等的 两个对象 // 1. js 中对象是无法使用 == 来比较的, 比是地址 // 2. 我们一般会定义如果对象的各个属性值都相等 那 ...
- 「2018-11-05模拟赛」T5 传送机 解题报告
5.传送机(sent.*) 问题描述: 黄黄同学要到清华大学上学去了.黄黄同学很喜欢清华大学的校园,每次去上课时总喜欢把校园里面的每条路都走一遍,当然,黄黄同学想每条路也只走一遍. 我们一般人很可能对 ...
- kmp算法初步理解
123456789 abbdaxnds Next 01212 第三位看第二位b,第二位和第三位相同,都是b,所以第三位的next是第二位的next加1,即1+1=2 第四位看第三位b,第四位d与第 ...