uva 1363---数论思维题

题目链接https://cn.vjudge.net/problem/UVA-1363

题意:输入正整数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<iostream>
#include<algorithm>
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<<ans<<endl;    
    }
 } 

感悟:好烦这种题,细节好容易错啊。。。心累,多一少一都是wa

 

转载于:https://www.cnblogs.com/Aiahtwo/p/10911451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值