#include <iostream> #include <vector> # include<bits/stdc++.h> using namespace std; const int MAX = 200010; // 最大值 2 * 10^5 int a[MAX]; // 存储每个数的质因数个数 int b[MAX]; // 存储每个数的因子个数 // 预处理函数 void decompose(int x){ int count = 0; int cnt = x; for(int i = 2 ;i*i<=x;i++) while(x%i == 0) count++,x/=i; if(x>1) count++; a[cnt] = count; } void yinzi(int x){ for(int i = 1;i*i<=x ;i++){ if(x%i==0){ b[x]++; if( i != x/i){ b[x]++; } } } } void preprocess(){ for(int i = 2;i<=MAX;i++){ decompose(i); } for(int i = 2;i<=MAX;i++){ yinzi(i); } } int main() { preprocess(); // 进行预处理 int T; cin >> T; // 读取查询的个数 while (T--) { int ans = 0; int x; cin >> x; // 每次查询一个数 x ans = max(a[x]*2,b[x]); cout<<ans<<endl; } return 0; }
个人思路就是 ,一个数的权值和 要么不拆 ,要不全拆成质数,因为任意一个数 可以拆成质因子相乘 ,而每一个质因子贡献度为2,于是我们可以先预处理一下一个数的因子数,和他拆成质因子相乘的 数量 比如说 60 可以拆成 2*2*3*5 那么就是4 ,每个贡献为2 所以就是4*2 但是 60本身的因子就是有12个 所以答案是12, 按照这个思路我们预处理一遍 然后直接查表就行,但是我不知道牛客会不会存全局表。如果不会存 则没必要打表了。。直接一个数一个数判断就可以了
#include <iostream> #include <vector> # include<bits/stdc++.h> using namespace std; const int MAX = 200010; // 最大值 2 * 10^5 //int a[MAX]; // 存储每个数的质因数个数 //int b[MAX]; // 存储每个数的因子个数 // 预处理函数 int decompose(int x){ int count = 0; int cnt = x; for(int i = 2 ;i*i<=x;i++) while(x%i == 0) count++,x/=i; if(x>1) count++; return count; } int yinzi(int x){ int count = 0; for(int i = 1;i*i<=x ;i++){ if(x%i==0){ count++; if( i != x/i){ count++; } } } return count; } void preprocess(){ for(int i = 2;i<=MAX;i++){ decompose(i); } for(int i = 2;i<=MAX;i++){ yinzi(i); } } int main() { preprocess(); // 进行预处理 int T; cin >> T; // 读取查询的个数 while (T--) { int ans = 0; int x; cin >> x; // 每次查询一个数 x // cout<<decompose(2)<<endl; // cout<<yinzi(2)<<endl; ans = max(decompose(x)*2,yinzi(x)); cout<<ans<<endl; } return 0; }