UVa1635Irrelevant Elements - 唯一分解定理
Posted lrj124
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa1635Irrelevant Elements - 唯一分解定理相关的知识,希望对你有一定的参考价值。
题意
给你 \(n\) 个数,每次求出相邻两个数的和组成新数列。经过 \(n-1\) 次操作后,得到一个数。求这个数 \(mod \ m\) 与哪些项无关。
如:当 \(m=2 \ , \ n=2\) 时 \(a_1 \ , \ a_2 , a_3 \Rightarrow a_1+a_2 \ , \ a_2+a_3 \Rightarrow \ a_1+2a_2+a_3\) 则与 \(a_2\) 无关
思路
由二项式定理知道结果系数是杨辉三角的第 \(n-1\) 行,问题转换成判断有多少个 \(C_n-1^i\) 可以整除 \(m\)。
考虑 \(m\) 与 \(C_n-1^i\) 的唯一分解,\(\prod_i=1^n fac_i^index_i\) 与 \(C_n-1^i\) 作比较,当所有的质因子都在 \(C_n-1^i\) 中出现并且次数都小于 \(C_n-1^i\) 的次数时,即可整除。
分解 \(C_n^i\) 时需要用到组合数的递推式:\(C_n^i=\fracn-i+1i \times C_n^i-1\)。分解时只考虑 \(\fracn-i+1i\),因为 \(C_n^i-1\) 在上一次中计算过了。
/************************************************
*Author : lrj124
*Created Time : 2019.08.09.21:03
*Mail : 1584634848@qq.com
*Problem : uva1635
************************************************/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
int n,m,m_index[maxn],factor[maxn],cnt,c_index[maxn],ans[maxn];
inline void init()
for (int i = 2;i*i <= m;i++)
if (!(m%i))
factor[++cnt] = i;
for (;!(m%i);m /= i,m_index[cnt]++);
if (m > 1)
factor[++cnt] = m;
m_index[cnt]++;
inline bool check(int N,int k)
N = N-k+1;
for (int i = 1;i <= cnt;i++)
for (;!(N%factor[i]);N /= factor[i],c_index[i]++);
for (;!(k%factor[i]);k /= factor[i],c_index[i]--);
for (int i = 1;i <= cnt;i++)
if (m_index[i] > c_index[i]) return false;
return true;
int main()
//freopen("uva1635.in","r",stdin);
//freopen("uva1635.out","w",stdout);
while (cin >> n >> m)
memset(m_index,0,sizeof(m_index));
memset(c_index,0,sizeof(c_index));
ans[0] = cnt = 0;
init();
for (int i = 1;i <= n-2;i++)
if (check(n-1,i)) ans[++ans[0]] = i+1;
printf("%d\n",ans[0]);
for (int i = 1;i <= ans[0];i++) printf("%s%d",i ^ 1 ? " " : "",ans[i]);
printf("\n");
return 0;
以上是关于UVa1635Irrelevant Elements - 唯一分解定理的主要内容,如果未能解决你的问题,请参考以下文章
UVa1635Irrelevant Elements - 唯一分解定理
UVa 1635 Irrelevant Elements (唯一分解定理 || 组合数学)