码迷,mamicode.com
首页 > 其他好文 > 详细

【UVa1635】Irrelevant Elements - 唯一分解定理

时间:2019-08-10 17:11:10      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:open   void   using   rac   cto   print   组成   line   %s   

题意

给你 \(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}=\frac{n-i+1}{i} \times C_{n}^{i-1}\)。分解时只考虑 \(\frac{n-i+1}{i}\),因为 \(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;
}

【UVa1635】Irrelevant Elements - 唯一分解定理

标签:open   void   using   rac   cto   print   组成   line   %s   

原文地址:https://www.cnblogs.com/lrj124/p/11332077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!