题目链接: https://vjudge.net/problem/LightOJ-1341
题目描述:
问有几种边长为整数的矩形面积等于a,且矩形的短边不小于b
算数基本定理的知识点:https://baike.baidu.com/item/%E7%AE%97%E6%9C%AF%E5%9F%BA%E6%9C%AC%E5%AE%9A%E7%90%86/10920095?fr=aladdin
1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include <cmath> 5 6 using namespace std; 7 8 typedef long long ll; 9 10 const int maxn = 1e6+10; 11 12 bool vis[maxn]; 13 vector<ll> v; 14 ll a,b; 15 16 //素数打表 17 void init_prime() 18 { 19 memset(vis,1,sizeof(vis)); 20 for(ll i = 2;i < maxn;i++) 21 { 22 for(ll j = i * i;j < maxn;j += i) 23 { 24 vis[j] = 0; 25 } 26 } 27 for(ll i = 2;i < maxn;i++) 28 { 29 if(vis[i] == 1) 30 v.push_back(i); 31 } 32 } 33 34 ll a_count(ll a); 35 36 int main() 37 { 38 int t,flag = 1; 39 init_prime(); 40 scanf("%d",&t); 41 while(t--) 42 { 43 scanf("%lld%lld",&a,&b); 44 if(b >= sqrt(a)) 45 { 46 printf("Case %d: %d\n",flag++,0); 47 continue; 48 } 49 else 50 { 51 ll cnt = 0; 52 for(ll i = 1;i < b;i++) 53 { 54 if(a % i == 0) 55 cnt++; 56 } 57 ll sum = a_count(a)/2; 58 sum -= cnt; 59 printf("Case %d: %lld\n",flag++,sum); 60 } 61 } 62 return 0; 63 } 64 65 66 ll a_count(ll a) 67 { 68 if(a == 0) 69 return 0; 70 ll num,sum = 1,i = 0; 71 while(v[i] < a && i < v.size()) 72 { 73 if(a % v[i] == 0) 74 { 75 num = 0; 76 while(a % v[i] == 0) 77 { 78 a /= v[i]; 79 num++; 80 } 81 sum *= (1+num); 82 } 83 i++; 84 } 85 if(a>1) 86 sum *= 1+1; 87 return sum; 88 }
原文地址:https://www.cnblogs.com/youpeng/p/10269257.html
时间: 2024-11-11 15:45:24