Irrelevant Elements UVA

来源:互联网 发布:企业数据接口 编辑:程序博客网 时间:2024/05/16 11:42

题目传送门

题意:给你n个数字,一次求出相邻的两个数字的和,会得到一个新的数列,重复这个操作,最后会变成一个数字,问这个数字的余数和哪些数字无关?

思路:这个题如果直接计算组合数的话要用到高精度算法,所以我们可以将这个问题转换为用唯一分解定理来做,求出来m的所有素因子,然后再求组合数的所有素因子判断即可。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>#define MAXN 100010#define MAXE 400#define INF 100000000#define MOD 10001#define LL long long#define pi 3.14159using namespace std;bool prime[MAXN];int p[MAXN];int cnt = 0;bool vis[MAXN];void is_prime() {    memset(prime, true, sizeof(prime));    for (int i = 2; i <= 100000; ++i) {        if (prime[i]) {            p[cnt++] = i;            for (int j = i + i; j <= 100000; j += i) {                prime[j] = false;            }        }    }}int main() {    std::ios::sync_with_stdio(false);    int n, m;    is_prime();    while (cin >> n >> m) {        n--;        memset(vis, false, sizeof(vis));        vector<int> primes;        int tmp = m;        for (int i = 0; i < cnt; ++i) {            int ans = 0;            while (tmp % p[i] == 0) {                tmp /= p[i];                ans++;            }            if (ans > 0) {                primes.push_back(p[i]);            }        }        if (tmp > 1) {            primes.push_back(tmp);        }        for (int i = 0; i < primes.size(); ++i) {            int temp = m;            int ans = 0;            int num = 0;            while (temp % primes[i] == 0) {                temp /= primes[i];                ans++;            }            for (int j = 1; j < n; ++j) {                int up = n - j + 1;                while (up % primes[i] == 0) {                    up /= primes[i];                    num++;                }                int down = j;                while (down % primes[i] == 0) {                    down /= primes[i];                    num--;                }                if (num < ans) {                    vis[j] = true;                }            }        }        vector<int> vec;        for (int i = 1; i < n; ++i) {            if (!vis[i])                vec.push_back(i + 1);        }        cout << vec.size() << endl;        for (int i = 0; i < vec.size(); ++i) {            if (i == vec.size() - 1)                cout << vec[i];            else                cout << vec[i] << " ";        }        cout << endl;    }    return 0;}
原创粉丝点击