TYVJ 1105 细胞分裂 解题报告

题解,转自:http://zhurui250.blog.163.com/blog/static/137270520201012410434807/

【问题转述】给出m1,m2以及若干个个si,求si^a mod m1^m2=0中a的最小值。若无解,输出-1。

【分析】由于数据太大,根本不能直接计算,但是我们可以通过因式分解来找到突破点。当m1分解出一个因数而s[i]没有时,这种情况肯定无解,当m1和s[i]对此因数各有一定数量时,我们可以根据这个算出让此因数得到整除的a最小值(可能不是所有因数中最优答案,取所有因数答案最大的)设x为m此因数的个数,y为s[i]此因数的个数,则a=x div y; If  y*a<x then inc(a)。

  我的代码如下:

#include <stdio.h>
#include <stdlib.h>
int num[100000], a[100000];
int len;
int n;

int main(int argc, char **argv)
{
	int i, j;
	int k = 2, s;
	int m1, m2;
	int t, ans = 0xFFFFFFF, l;
	scanf("%d", &n);
	scanf("%d%d", &m1, &m2);
	while(m1 != 1){
		if(m1 % k == 0){
			a[len] = k;
			do{
				m1 /= k;
				num[len] += m2;
			}while(m1 % k == 0);
			len++;
		}
		k++;
	}
	for(i = 0; i < n; i++){
		scanf("%d", &s);
		t = 0;
		for(j = 0; j < len; j++){
			if(s % a[j] != 0){
				break;
			}
			k = 0;
			while(s % a[j] == 0){
				s /= a[j];
				k++;
			}
			l = num[j] / k;
			if(l * k < num[j]){
				l++;
			}
			if(t < l){
				t = l;
			}
		}
		if(j == len && ans > t){
			ans = t;
		}
	}
	if(ans == 0xFFFFFFF){
		printf("-1\n");
	}else{
		printf("%d\n", ans);
	}
	return 0;
}
posted @ 2011-08-04 16:55  zqynux  阅读(277)  评论(0编辑  收藏  举报