zoukankan      html  css  js  c++  java
  • [数学] Jzoj P3912 超氧化钾

    Description

    作为一个化学小考只有77分的同学,小W感觉很有压力,所以他决定搞化学。今天他开始研究超氧化钾,这是一种很神奇的离子化合物,在高温下空间结构是立方体,如下图所示。有一天教黄交给了小W一个任务:根据教黄多年淘金的经验,他发现超氧化钾有一个神奇的性质就是如果一组有序的整数(x,y,z)满足z=x mod 1+x mod 2+…+x mod y,那么对于超氧化钾来说这个位置上的离子就是一个关键离子。通过用回旋加速器得到高速粒子来攻击这个离子,他就可以获得铜铝制金法的催化剂。现在教黄想知道对于一个给定的x和y对应的z值是多少。
     

    Input

    两个整数x,y。

    Output

    一个整数z。
     

    Sample Input

    1 1

    Sample Output

    0
     

    Data Constraint

    40%的数据,y<=10^5。
    100%的数据,1<=x,y<=10^9。

    题解

    • 首先,40%的数据,直接暴力做就好了
    • 100%,找规律
    • 对于y>x的数,显然在y-x后面这一段都是x,这个应该没问题
    • 然后我们就可以找到这个规律 [x/p+1~x/(p-1)]是一个公差为p-1的等差数列
    • 然后就没有然后了

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #define ll long long
     5 using namespace std;
     6 ll x,y,ans,l,r,k,inf=1e5;
     7 int main()
     8 {
     9     scanf("%lld%lld",&x,&y);
    10     if (y<=inf)
    11     {
    12         for (ll i=1;i<=y;i++) ans+=x%i;
    13         printf("%lld
    ",ans); return 0;
    14     }
    15     for (int i=2;i;i++)
    16     {
    17         if (x/(i-1)<inf) { k=min(x/(i-1),y); break; }
    18         l=x/i+1,r=min(x/(i-1),y),ans+=(x%l+x%r)*(r-l+1)/2;
    19     }
    20     for (ll i=2;i<=k;i++) ans+=x%i;
    21     if (x<y) ans+=(y-x)*x;
    22     printf("%lld",ans);
    23 }
  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/Comfortable/p/10316915.html
Copyright © 2011-2022 走看看