题解,转自: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;
}