[ABC114D] 756 题解
题意
给定一个数
分析
首先有这样一个性质,对于一个数
那么,
简单证明一下,对于第
题干要求因数个数为
同理,
因为
那么,对于第一种情况,对答案的贡献为
同理,第二种的贡献
第三种的贡献
第四种的贡献
最后看数据范围。
#include<bits/stdc++.h> using namespace std; const int N = 305; int n; int a[105][105]; bool vis[105]; int pr[105], tot; void init(){ for(int i = 2; i<=100; i++){ if(vis[i]) continue; vis[i] = 1, pr[++tot] = i; for(int j = i; j<=100; j+=i){ vis[j] = 1; } }//数据范围很小很小所以简单筛一下质数就行。 for(int i = 2; i<=100; i++){ int tmp = i; for(int j = 1; j<=tot; j++){ if(tmp%pr[j] == 0){ while(tmp%pr[j] == 0){ tmp/=pr[j]; a[i][j]++;//对1~100内的数分解质因数。 } } } } } int f[N]; int sum[N]; int ts[N]; int main(){ scanf("%d", &n); init(); for(int i = 1; i<=n; i++){ for(int j = 1; j<=tot; j++){ sum[j]+=a[i][j];//求n!因数分解后质因数的指数。 } } int ans = 0; int L = 0, R = 0, Y = 0; sort(sum+1, sum+1+tot, greater<int>()); for(int i = 1; i<=tot; i++){ if(sum[i]>=24){ ts[24]++; } if(sum[i]>=14){ ts[14]++; } if(sum[i]>=74){ ts[74]++; } if(sum[i]>=4){ ts[4]++; } if(sum[i]>=2){ ts[2]++; } } if(ts[74]){ ans+=ts[74]; } if(ts[24]){ ans+=ts[24]*(ts[2]-1); } if(ts[14]){ ans+=(ts[14]*(ts[4]-1)); } if(ts[4]){ ans+=(ts[4]*(ts[4]-1)/2*(ts[2]-2)); } printf("%d\n", ans); return 0; }