https://www.51nod.com/Challenge/Problem.html#!#problemId=1495
大于等有t的数即为1 其他的为0 问题转换为求有多少区间权值大于等于k 因为都是大于等于0的数 有单调性 双指针扫一遍即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
ll ary[maxn];
ll t,b,c,mod;
int n,k;
int main()
{
ll ans;
int i,p,cnt;
scanf("%d%d%lld%lld%lld%lld%lld",&n,&k,&t,&ary[0],&b,&c,&mod);
for(i=1;i<=n;i++) ary[i]=(ary[i-1]*b+c)%mod;
ans=0,p=0,cnt=0;
for(i=1;i<=n;i++){
while(p<n&&cnt<k){
p++;
if(ary[p]>=t) cnt++;
}
if(cnt>=k) ans+=(n-p+1);
if(ary[i]>=t) cnt--;
}
printf("%lld\n",ans);
return 0;
}