主要知识点<<<类扩展欧几里得>>> 但是我没看懂推到过程,都写的我一愣一愣的,真是太难了,然后直接记模板
对于
这种
ll fabcn(ll a,ll b,ll c,ll n)
{
if(a==0)return 0;
if(a>=c||b>=c)
return ((n+1)*n/2)*(a/c)+(n+1)*(b/c)+fabcn(a%c,b%c,c,n);
else
{ ll m = (a*n+b)/c;
return n*m - fabcn(c,c-b-1,a,m-1);
}
}
这个就让求p * i % q , 但是不让最终取模, 也就是每一项都取一下模, 然后就是答案,
所以就是p * (n + 1) * n / 2 下取整 , ,,a mod b == a - (floor)(a / b )* b , 后面的那个就是类扩展欧几里得,直接套上模板就行了
#include <iostream>
#include <cstdio>
typedef long long ll ;
using namespace std;
ll p,q,n,t;
ll fabcn(ll a,ll b,ll c,ll n)
{
if(a==0)return 0;
if(a>=c||b>=c)
return ((n+1)*n/2)*(a/c)+(n+1)*(b/c)+fabcn(a%c,b%c,c,n);
else
{ ll m = (a*n+b)/c;
return n*m - fabcn(c,c-b-1,a,m-1);
}
}
int main()
{
scanf("%lld" , &t) ;
while(t--)
{
scanf("%d%d%d" , &p , &q , &n) ;
printf("%lld\n",p*(n*(n+1)/2)-q*fabcn(p,0,q,n));
}
return 0;
}