zoukankan      html  css  js  c++  java
  • HDU4473_Exam

    很考验智商的一个题目,赛后看完别人的题解后秒懂了。

    首先定义一个函数f(x)表示a,b的有序组合情况数使得a*b为x的一个约数。

    现在给定你一个n,要你求出f(1)+f(2)+……+f(n);

    题目智商味道太浓厚,本屌表示智商拙计。

    可以这样来考虑问题,a*b为x的一个约数,其实就等价于a*b*c=x,c为任意一个正整数。

    所以整个问题转化为有多少个有序数对(a,b,c)使得a*b*c不大于n。

    到这里问题就变得好办多了。

    由于直接枚举复杂度过高,我们在枚举的时候可以假定a<=b<=c,同时把中间a,b,c是否相等的情况都记录下来。

    这样在求解答案的时候只要排列一下就可以了。

    所以我们在枚举a的时候,只要枚举的范围就是1到n^(1/3),b需要枚举的范围就是n^(1/3)到n^(2/3),这样算来整个题目的时间复杂度为n^(2/3)大约为2*10^7,可以承受的哦。

    题目注意统计的时候,尽量避免不必要的运算。

     1 #include <cstdio>
     2 using namespace std;
     3 typedef long long ll;
     4 ll n,m,k,ans,i,j;
     5 int k1,k2,cas=0;
     6 
     7 int main()
     8 {
     9     while (scanf("%I64d",&n)!=EOF)
    10     {
    11         ans=0;
    12         for (i=1; i*i*i<=n; i++) ;
    13         ans+=--i;
    14         for (; i; i--)
    15         {
    16             m=n/i;
    17             for (j=1; j*j<=m; j++) ;
    18             ans+=3*(m/i-i+--j-i);
    19             for (; j>i; j--) ans+=6*(m/j-j);
    20         }
    21         printf("Case %d: %I64d
    ",++cas,ans);
    22     }
    23     return 0;
    24 }
    如有转载,请注明出处(http://www.cnblogs.com/lochan)
  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/lochan/p/3398429.html
Copyright © 2011-2022 走看看