NYOJ 508 余数求和 (数论问题)

题目描述

http://acm.nyist.net/JudgeOnline/problem.php?pid=508


给你两个数n,k,请求出的值。

输入
每行两个数n, k(1 <= n, k <= 10^9).
输出
输出和,每个结果占一行。
样例输入
5 4
5 3
样例输出
5
7

题目分析:

对于此题不能直接进行暴力,数值大,只能用sqrt(n)的算法,首先计算n%i的余数和,i=1~n;注意到:n%i=n/i*i;

因此我们可以模拟从i=1~sqrt(n);sum+=n%i;对于i对应的j=n/i,可以知道(n/i~n/i+1)==d;对与这组数,计算得到

s1=((n/i-n/(i+1))*n)-d*(n/(i+1)+1+......+n/i);sum+=s1;直到循环结束,就得到n%i的余数和,我们用ModSum(n)。

现在我们求k%i的余数和,i=1~n;进行分析k和n即可,

一、k<n  res=ModSum(k)+(n-k)*k;注:当n>k时,k%n==k

二、k=n  res=ModSum(k)

三、k>n  res=ModSum(k); { for(int i=n+1;i<=n;i++)

res-=k%i;//减去多计算的值即可。

}

AC代码:

/**
 *1、ModSum1():O(n)
 *2、ModSum2():O(sqrt(n))
 *1   2   3   4
 *16  8   5   4
 *  1   2   3
 */
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
#define LL long long
#define MOD 1000000007
using namespace std;
LL ModSum1(LL n){
    LL t=(n+1)/2-1;
    LL sum=t*(t+1)/2;
    for(LL i=1;i<=n/2;i++){
        sum+=n-(n/i*i);
    }
    return sum;
}

LL ModSum2(LL n,LL k){
    LL sum=0,n1=n;
    n=k;
    LL tem=sqrt(n);
    for(LL i=1;i<=tem;i++){
        if(n/i==i){
            sum+=n-n/i*i;
            continue;
        }
        sum+=n-n/i*i;
        sum=sum;
        //cout<<n/(i+1)<<" "<<n/i<<endl;
        LL tt=n*(n/i-(n/(i+1)))-i*((n/i+(n/(i+1))+1)*(n/i-(n/(i+1)))/2);
        //sum=(sum+(tt%MOD*i%MOD)%MOD)%MOD;
        sum=(sum+tt);
    }
    //cout<<n1<<k<<endl;
    if(k<=n1){
        sum+=(n1-k)*k;
    }
    else {
        for(LL i=n1+1;i<=k;i++){
            sum-=k%i;
        }

    }
    return sum;
}
int main()
{
	long long n,k;
	while(cin>>n>>k){
        //LL sum1=ModSum1(n);
        LL sum2;

        sum2=ModSum2(n,k);

        cout<<sum2<<endl;
	}
	return 0;
}
        
时间: 2024-10-31 20:58:04

NYOJ 508 余数求和 (数论问题)的相关文章

[Luogu 2261] CQOI2007 余数求和

[Luogu 2261] CQOI2007 余数求和 <题目链接> 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \(10^{9}\) 的范围注定会卡掉暴力. 所以我们要用除法分块来优化. 由题意得:\(ans = \sum_{i=1}^{n} k \bmod i\) 我们知道,\(a \bmod b = a - b \times \lfloor \frac{a}{b} \rfloor\) 因此,\

luogu2261余数求和题解--整除分块

题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\times\) \(i\),于是我们只需要求\(N * k-\sum_{i=1}^N {\lfloor {k/i}\rfloor\times i}\) 这里就需要数论分块,也称作整除分块的知识 结论: \(\forall{i} \in [x,\lfloor {k/{\lfloor {k/x}\rfl

# [银联初赛]码队弟弟的求和(数论-分块求和)

[银联初赛]码队弟弟的求和(数论-分块求和) 题链(计蒜客) 思路: 平方之和公式:\(1^2+2^2+...+n^2=\frac{n*(n+1)*(2*n+1))}{6}\),前缀和处理 分块求和思想: \(\lfloor \frac{n}{i} \rfloor\)对于每一个值,可能有多个\(i\)对应,把这些\(i\)分在同一块,累加的时候直接使用乘积代替加法 int res=0; for(int l=1,r;l<=n;l=r+1){ r=n/(n/l); res+=(n/i*(r-l+1)

题解 P2261 【[CQOI2007]余数求和】

题目链接 Solution [CQOI2007]余数求和 题目大意:给定\(n,k\),求\(\sum_{i = 1}^{n}k \bmod i\) 解析:我们考虑大力化柿子 \[\sum_{i = 1}^{n}k \bmod i\] \[=\sum_{i = 1}^{n}k-i \times \lfloor \frac{k}{i} \rfloor\] \[=nk-\sum_{i = 1}^{n}i \times\lfloor \frac{k}{i} \rfloor\] 然后我们发现右边\(\s

P2261 [CQOI2007]余数求和

题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29 输入输出格式 输入格式: 两个整数n k 输出格式: 答案 输入输出样例 输入样例#1: 10 5 输出样例

余数(数论分块)

题目描述: 题解: 首先容易想到:当 i > n 时,n mod i = n 所以如果 m > n , ans+=((m-n)%mod)*(n%mod)%mod; m=n; 接下来考虑 i<=n 的情况: 后面这个东西很明显可以用数论分块算,时间复杂度是O(sqrt(N)) 但我当时做的时候还没有学数论分块,所以代码十分丑陋 #include<iostream> #include<cstdio> #include<cmath> using namesp

ACM学习历程—SNNUOJ1132 余数之和(数论)

Description 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). Input 输入1个数N(2 <= N <= 10^12). Output 输出F(n). Sample Input 6 Sample Output

【洛谷P2261】[CQOI2007]余数求和

题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 -- + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29 输入输出格式 输入格式: 两个整数n k 输出格式: 答案 输入输出样例 输入样例#1: 10 5 输出样例

NYOJ 22 素数求和问题

描述 现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和. 输入 第一行给出整数M(0<M<10)代表多少组测试数据 每组测试数据第一行给你N,代表该组测试数据的数量. 接下来的N个数为要测试的数据,每个数小于1000 输出 每组测试数据结果占一行,输出给出的测试数据的所有素数和 样例输入 3 5 1 2 3 4 5 8 11 12 13 14 15 16 17 18 10 21 22 23 24 25 26 27 28 29 30 样例输