小凯的数字

 

传送门:https://www.luogu.org/problemnew/show/P4942

可以发现,l~r凑成的大数%9得到的结果相当于l~r每一个数%9相加的结果,所以用等差数列求和公式求出l~r数字的和,又由于(a*b)%p 等价于(a%p*b%p)%p,但是这个式子无法运用到除法中,因此将等差数列拆分成首项加末项:(l+r)和项数(r-l+1)两部分,至于“/2”,判断这两部分哪个为偶数,哪个就/2,然后在套用上面那个公式即可。

#include<cstdio>
using namespace std;
#define ll long long int 
int n;
ll l,r,ans,part1,part2;
int main()
{
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    {//(l+r)(r-l+1)/2 
        scanf("%lld%lld",&l,&r);
        part1 = l+r;
        part2 = r-l+1;
        if(part1%2==0) part1 /= 2;
        else part2 /= 2;
        ans = (part1%9*part2%9)%9;
        printf("%lld\n",ans);
    }
    return 0;
 } 

 

posted @ 2018-11-02 13:36  我的露娜不会飘  阅读(113)  评论(0编辑  收藏  举报