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; }