http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1495&judgeId=519564
这道题给我说了尺取法我也不会,没办法只能看别人的博客(;´д`)ゞ
感觉弄得好巧妙啊~
①首先,条件是选取的长度大于等于 这个好理解,就他的两个指针 就行了。
②但是要求从大到小第 大的数要大于 ,哇~这个就挺巧妙的了,转换成比 大的有 个,然后就又是前缀和,用一个 表示从 到 大于等于 的个数,那么 中的就是 ,只要 就满足条件
③然后计算答案时,就是用的尺取法的关键了,只要哪一个 满足条件那么后面的 一直到 都是满足条件的,于是就阔以直接算出有 个了
#include"iostream"
using namespace std;
const int maxn=1e7+5;
long long a[maxn],sum[maxn];//sum用来记录前i个大于T的有多少个
int main()
{
long long N,K,T,b,c,p;
while(cin>>N>>K>>T>>a[0]>>b>>c>>p)
{
long long ans=0;
for(int i=1;i<=N;i++)
{
a[i]=(a[i-1]*b+c)%p;
sum[i]=sum[i-1];
if(a[i]>=T)sum[i]++;//②
}
int L=1,R=1;
while(1)
{
while(R<=N&&sum[R]-sum[L-1]<K)R++;//①
if(R>N)break;
ans+=N-R+1;//③
L++;
}
cout<<ans<<endl;
}
}