Kattis - itsamodmodmodmodworld It's a Mod, Mod, Mod, Mod World (类欧几里得)

题意:计算$\sum\limits_{i=1}^n[(p{\cdot }i)\bmod{q}]$

类欧模板题,首先作转化$\sum\limits_{i=1}^n[(p{\cdot}i)\bmod{q}]=\sum\limits_{i=1}^n[p{\cdot}i-\left\lfloor\frac{p{\cdot}i}{q}\right\rfloor{\cdot}q]$,然后只要能快速计算$\sum\limits_{i=1}^n\left\lfloor\frac{p{\cdot}i}{q}\right\rfloor$就行了。

记$f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor$

则有$f(a,b,c,n)=\left\{\begin{matrix}\begin{aligned}&(n+1)\left\lfloor\frac{b}{c}\right\rfloor,a=0\\&f(a\%c,b\%c,c,n)+\frac{n(n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor,a>=c\:or\:b>=c\\&n\left\lfloor\frac{an+b}{c}\right\rfloor-f(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1),others\end{aligned}\end{matrix}\right.$

由于递推过程类似欧几里得法求gcd,因此称作类欧~~

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+10;
 5 int p,q,n;
 6 ll f(ll a,ll b,ll c,ll n) {
 7     if(!a)return (n+1)*(b/c);
 8     if(a>=c||b>=c)return f(a%c,b%c,c,n)+n*(n+1)/2*(a/c)+(n+1)*(b/c);
 9     ll m=(a*n+b)/c;
10     return n*m-f(c,c-b-1,a,m-1);
11 }
12 int main() {
13     int T;
14     for(scanf("%d",&T); T--;) {
15         scanf("%d%d%d",&p,&q,&n);
16         printf("%lld\n",(ll)n*(n+1)/2*p-f(p,0,q,n)*q);
17     }
18     return 0;
19 }

猜你喜欢

转载自www.cnblogs.com/asdfsag/p/11393783.html
mod