小凯的数字
传送门: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; }