#include<cstdio> #include<algorithm> usingnamespacestd; constint N = 100010;
int n; int a[N];
intgcd(int a,int b){ return b ? gcd(b,a%b):a; }
intmain(){ scanf("%d",&n); for (int i = 0;i < n;i++) scanf("%d",&a[i]); sort(a,a+n); int d = 0;// 求gcd,i从1开始 for (int i = 1;i < n;i++) d = gcd(d,a[i] - a[0]); if (d == 0) printf("%d\n",n); elseprintf("%d\n",(a[n-1] - a[0])/d + 1); return0; }
#include<cstdio> #include<iostream> #include<algorithm> usingnamespacestd; constint N = (1<<20)+1; typedeflonglong LL;// 最多要计算20!,long long最大是2^31-1,可以存下 int primes[N],cnt;// primes存放所有质数 bool st[N]; int min_p[N];// 存放i的最小质因数 int fact[30],sum[25];// fact存放i的所有质因数,sum存放对应的次数,sum的次数最多不超过20
voidget_primes(int n){ for (int i = 2;i <= n;i++){ if (!st[i]) min_p[i] = i,primes[cnt++] = i; for (int j = 0;j < cnt && primes[j]*i <= n;j++){ int t = primes[j]*i; st[t] = true; min_p[t] = primes[j]; if (i % primes[j] == 0) break; } } }
intmain(){ get_primes(N);
int x; while (scanf("%d",&x) != EOF){ // 分解x的质因数,p为最小质因数,x = p*y,y=p1*z,z=p2*w,...,每次用最小质因数来分解,直到1 int k = 0,tot = 0;// k记录质因数的个数,tot记录总的次数 while (x > 1){ int p = min_p[x]; fact[k] = p,sum[k] = 0; while (x % p == 0){ x /= p; sum[k] ++,tot++; } k++; }
// 计算多重组合数 LL res = 1;// 计算阶乘可以用前缀和方式处理一下,不用重复计算 for (int i = 2;i <= tot;i++) res *= i;// 求tot! for (int i = 0;i < k;i++) for (int j = 2;j <= sum[i];j++) res /= j;// tot/(sum[i])!