题目背景
数学题,无背景
题目描述
给出正整数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
输出样例#1:
29
说明
30%: n,k <= 1000
60%: n,k <= 10^6
100% n,k <= 10^9
分析
很巧妙的一道题,考试的时候可以写个程序找规律。
洛谷题解里面写的已经很好了https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P2261
代码
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } int n,k; ll ans; int main() { n=read();k=read(); for(int i=1;i<=n;i++) { int p,q; p=k/i,q=k%i; ll j=p?k/p:n; if(j>n)j=n; ans+=q*(j-i+1)-(j-i+1)*(j-i)/2*p; i=j; } printf("%lld",ans); return 0; }