zoukankan      html  css  js  c++  java
  • noip模拟赛 整除

    分析:最暴力的思想就是枚举一边啦,然后就会发现有很多n/i的结果都是相同的,可以每次跳过这一段,这样能过60分.

          想不出其它解法了,打个表找了一下规律:

                   ans   num

                    1     1

                    2     2

                    3     2

                    4     3

                    5     3

    会发现除了第一个ans以外,其它的就是一个等差数列,应用一下等差数列求和公式,二分一下项数就可以了.

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    ll n, ans;
    
    ll cal(ll x)
    {
        return 2 * x + x * (x - 1) / 2; 
    }
    
    int main()
    {
        scanf("%lld", &n);
        ll l = 0, r = 1000000000;
        while (l <= r)
        {
            ll mid = (l + r) >> 1;
            if (cal(mid) * 2 + 1 <= n)
            {
                ans = mid;
                l = mid + 1;
            }
            else
                r = mid - 1;
        }
        if (cal(ans) * 2 + 1 == n)
            printf("%lld
    ", ans * 2 + 1);
        else
        {
            ll temp = ans + 2, temp2 = n - (cal(ans) * 2 + 1);
            if (temp >= temp2)
                printf("%lld
    ", ans * 2 + 2);
            else
                printf("%lld
    ", ans * 2 + 3);
        }
    
        return 0;
    }

                                                  

  • 相关阅读:
    Nginx安装
    node.js搭建vue脚手架
    Oracle引入数据
    MVC引入Junit单元测试
    Git版本控制器
    IDEA-Maven
    SSM框架整合
    【测试基础第五篇】测试用例编写和评审
    【测试基础第四篇】测试用例设计方法
    【测试基础第三篇】需求测试分析
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7695639.html
Copyright © 2011-2022 走看看