51nod 1225 余数的和 数学

1225 余数之和

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

 收藏

 关注

F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n)。其中%表示Mod,也就是余数。

例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3。

给出n,计算F(n), 由于结果很大,输出Mod 1000000007的结果即可。

Input

输入1个数N(2 <= N <= 10^12)。

Output

输出F(n) Mod 1000000007的结果。

Input示例

6

Output示例

3思路:余数成等差;时间复杂度sqrt(n);   用等差数列求和的时候有个除法,所以用了下逆元;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define mod 1000000007
#define inf 999999999
#define esp 0.00000000001
//#pragma comment(linker, "/STACK:102400000,102400000")
void extend_Euclid(ll a, ll b, ll &x, ll &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    extend_Euclid(b, a % b, x, y);
    ll tmp = x;
    x = y;
    y = tmp - (a / b) * y;
}
ll mul(ll x,ll y)
{
    x%=mod;
    y%=mod;
    return (x*y)%mod;
}
ll divi(ll x,ll y)
{
    ll xx,yy;
    extend_Euclid(y,mod,xx,yy);
    xx=(xx%mod+mod)%mod;
    return mul(x,xx);
}
int main()
{
    ll x,y,z,i,t;
    scanf("%lld",&z);
    ll ans=0;
    for(i=2;i<=z;i++)
    {
        if(z%i!=0)
        {
            ll d=z/i;
            ll maxx=(z%i)/d+1;
            d=-d;
            ans+=mul((z%i),maxx)+divi(mul(maxx,mul((maxx-1),d)),2);
            ans=(ans%mod+mod)%mod;
            i+=maxx-1;
        }
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-10-24 00:29:09

51nod 1225 余数的和 数学的相关文章

51nod 1225 数学

F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数. 例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3. 给出n,计算F(n), 由于结果很大,输出Mod 1000000007的结果即可. Input 输入1个数N(2 <= N <= 10^12). Output 输出F(n) Mod 100000

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

bzoj 1257: [CQOI2007]余数之和sum 数学 &amp;&amp; 枚举

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Status] Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3

51nod B君的圆锥(数学)

题目链接: B君的圆锥 基准时间限制:1 秒 空间限制:131072 KB B君要用一个表面积为S的圆锥将白山云包起来. B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少. 注意圆锥的表面积包括底面和侧面. Input 一行一个整数,表示表面积S.(1 <= S <= 10^9) Output 一行一个实数,表示体积. Input示例 8 Output示例 1.504506 题意: 思路: 找打圆锥体积与表面积的关系,再找出体积的最大值就好了,可以发现当圆锥的底面积PI*r^2=S

BZOJ_1257_ [CQOI2007]余数之和sum_数学

题意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值. 分析:把k mod n搞成k - k/n*n; 答案就是(k+1)*k/2减去后面那坨. k/i*i 发现每段相等的k/i乘了一个等差数列. 完了. 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5

简单的数学思想

l  筛法求素数 把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中选择最小的数是素数,然后去掉它的倍数.依次类推,直到筛子为空时结束.如有: 1 2 3 4 5 6 7 89 10 11 12 13 14 1516 17 18 19 20 21 22 23 24 2526 27 28 29 30 1不是素数,去掉.剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 1517 19 21 23 25 27 29 剩下的数中3最小

信息安全-3:负数取模[转]

背景 最近在一道 Java 习题中,看到这样的一道题: What is the output when this statement executed:System.out.printf(-7 % 3); 正整数的取余运算大家都很熟悉,但是对于负数.实数的取余运算,确实给人很新鲜的感觉.于是我对此进行了一些探索.我发现,这里面还是颇有一点可以探索的东西的. 探究 首先,看看自然数的取模运算(定义1): 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = qd +

C++ 备忘录 (1)

取模: 1. 转载自:http://ceeji.net/blog/mod-in-real/ 1 背景 2 3 最近在一道 Java 习题中,看到这样的一道题: 4 5 What is the output when this statement executed: 6 System.out.printf(-7 % 3); 7 8 正整数的取余运算大家都很熟悉,但是对于负数.实数的取余运算,确实给人很新鲜的感觉.于是我对此进行了一些探索.我发现,这里面还是颇有一点可以探索的东西的. 9 10 探究

ECMAScript5学习笔记-第11章

11.表达式 11.1  主值表达式  语法:PrimaryExpression : this:执行为当前执行环境的ThisBinding Identifier :执行遵循 标识符解析 的标识符查找.标识符执行的结果总是一个 Reference 类型的值.  Literal:  ArrayLiteral:一个零个或者多个表达式的序列,其中每一个表示一个数组元素,并且用方括号括起来 当元素列表中的一个逗号没有被 AssignmentExpression 优先处理(如,一个逗号在另一个逗号之前.)的