UVA1635IrrelevantElement

来源:互联网 发布:域名交易流程 编辑:程序博客网 时间:2024/06/05 09:26
//UVA1635IrrelevantElement#include<cstdio>#include<cstring>#include<cmath>#include<vector>using namespace std;const int maxn = 100000;void get_primes(int m, vector<int>& primes) {int n = floor(sqrt(m) + 0.5);for(int i = 2; i <= n; i++) {if(m % i == 0) {primes.push_back(i);while(m % i == 0) m /= i;}}if(m > 1) primes.push_back(m);//printf("primes = %d\n", primes.size());}int bad[maxn];void solve(int m, int n, vector<int> primes) {memset(bad, 0, sizeof(bad));for(int i = 0; i < primes.size(); i++) {int x = m, min_e = 0, e = 0;while(x % primes[i] == 0) {    x /= primes[i]; min_e++;//唯一分解定理 }    for(int k = 1; k < n - 1; k++) {//递推各项系数的素分解     x = n - k;    while(x % primes[i] == 0) {    x /= primes[i]; e++;//分子 }x = k;while(x % primes[i] == 0) {//分母 x /= primes[i]; e--;}if(e < min_e) bad[k] = 1;/*if(bad[i])*/ //printf("k = %d, i = %d, e = %d, min_e = %d\n", k, i, e, min_e);}}vector<int> ans;for(int k = 1; k < n - 1; k++) {if(!bad[k]) ans.push_back(k + 1);}printf("%d\n", ans.size());if(!ans.empty()) for(int i = 0; i < ans.size(); i++) {if(i) printf(" "); printf("%d", ans[i]);}printf("\n");}int main() {    int n, m;    while(scanf("%d%d", &n, &m) == 2 && n) {        vector<int> primes;    get_primes(m, primes);    solve(m, n, primes);}return 0;} /*3 2*/

原创粉丝点击