题目链接:
题意:输入正整数n和k(范围均为1e9),求∑(k mod i),i从1~n。
题目思路:直接暴力for循环求解必然超时,所以我们需要找找规律~~~
之后我们写几组数据之后可以发现当k/i的商相同的时候他们的余数成一个等差数列,而且数列首相是q,公差是p,项的个数是余数/商。
我们发现k%i=a,k/i=b; 余数a是呈等差数列的; 公比是b,首项是a,项数是(a+b-1)/b;
举个例子:k=13,n=16;
13%1=0,
13%2=1....6
13%3=1....4
13%4=1.... 3
13%5=3....2 13%6=1....2
13%7=6....1 13%8=5....1 13%9=4....1 13%10=3....1 13%11=2....1 13%12=1...1 13%13=0....1
13%14=13...0 13%15=13....0 13%16=13....0
开始上代码:
#include#include using namespace std;long long solve(long long a,long long b,long long cnt){ return (long long)((cnt+1)*(2*a-cnt*b)/2);}int main(){ int n,k; long long a,b; while(~scanf("%d%d",&n,&k)) { long long ans=0,i=1; while(i<=n) { a=k%i; b=k/i; long long cnt=n-i;//剩余项数 if(b>0) cnt=min(cnt,a/b);//保证项数的正确性 ans+=solve(a,b,cnt);//cnt项的等差数列和 i=i+cnt+1; } cout< <
感悟:好烦这种题,细节好容易错啊。。。心累,多一少一都是wa