zoukankan      html  css  js  c++  java
  • LightOJ 1341 Aladdin and the Flying Carpet(唯一分解定理)

    http://lightoj.com/volume_showproblem.php?problem=1341

    题意:
    给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数。

    思路:
    根据唯一分解定理,把X写成若干素数相乘的形式,则X的正因数的个数为:(1+a1)(1+a2)(1+a3)...(1+an)。(ai为指数)

    因为这道题目是求矩形,所以知道一个正因数后,另一个正因数也就确定了,所以每组正因数重复计算了两遍,需要除以2。

    最后减去小于b的因数。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<queue>
     7 #include<cmath>
     8 #include<map>
     9 #include<stack>
    10 using namespace std;
    11 
    12 const int maxn=1e6+1000;
    13 
    14 int n;
    15 int cnt=0;
    16 int primes[maxn];
    17 int vis[maxn];
    18 
    19 void get_primes()
    20 {
    21     int m=sqrt(maxn+0.5);
    22     for(int i=2;i<=m;i++)
    23     {
    24         if(!vis[i])
    25         {
    26             for(int j=i*i;j<=maxn;j+=i)
    27                 vis[j]=1;
    28         }
    29     }
    30     for(int i=2;i<=maxn;i++)
    31         if(!vis[i])   primes[cnt++]=i;
    32 }
    33 
    34 int main()
    35 {
    36     //freopen("D:\input.txt","r",stdin);
    37     int T;
    38     int kase=0;
    39     get_primes();
    40     scanf("%d",&T);
    41     while(T--)
    42     {
    43         long long a,b;
    44         scanf("%lld%lld",&a,&b);
    45         long long x=a;
    46         if(a<=b*b)  {printf("Case %d: 0
    ",++kase);continue;}
    47         long long ans=1;
    48         for(int i=0;i<cnt&&primes[i]*primes[i]<=a;i++)
    49         {
    50             if(a%primes[i]==0)
    51             {
    52                 long long num=0;
    53                 while(a%primes[i]==0)
    54                 {
    55                     num++;
    56                     a/=primes[i];
    57                 }
    58                 ans*=(1+num);
    59             }
    60         }
    61         if(a>1)  ans*=2;
    62         ans/=2;
    63         for(long long i=1;i<b;i++)
    64             if(x%i==0)  ans--;
    65          printf("Case %d: %lld
    ",++kase,ans);
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    String(Java版本)
    前端工程化开发之yeoman、bower、grunt
    前端自动化开发之grunt
    前端模块化开发之seaJs
    浅谈图片蒙版效果-webkit-mask
    div模拟textarea实现高度自增长
    预加载显示图片的艺术
    轻松实现localStorage本地存储
    利用Navigation Timing测量页面加载时间
    利用jstree插件轻松构建树应用
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6820862.html
Copyright © 2011-2022 走看看