等差数列。
因为直接算的话可能会有较大的精度丢失(个人认为),
所以用到二分,二分有多少项。
时间复杂度O(nlogT)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1e5+77;
int n;
LL t,ans;
LL work(LL x,LL y,LL d)//首项,公差
{
LL L=0,R=t/(x+y),mid,cnt,s,sum,a1;
a1=x+y;
if(a1>t)
{
return (t-x)>0?(t-x):0;
}
while(L<=R)
{
mid=(L+R)>>1;
sum=(2*a1+d*mid)*(mid+1)/2;
if(sum<=t) cnt=mid,L=mid+1;
else R=mid-1;
}
sum=(a1+a1+cnt*d)*(cnt+1)/2;
if(sum==t)
{
return sum-(cnt+1)*x;
}
if(sum<t)
{
s=0;
if(t-sum>x) s+=t-sum-x;
return sum-(cnt+1)*x+s;
}
}
int main()
{
freopen("a.txt","r",stdin);
scanf("%d%lld",&n,&t);
for(int i=1;i<=n;i++)
{
LL x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
if(x==0) {ans+=t;continue;}
LL tim=work(x,y,z);
ans+=tim;
}
printf("%lld\n",ans);
int p=work(9,2,5);
return 0;
}