不带修改的莫队 最简单的那种
n*n是可以取自己的
n*(n-1)是不取自己的
先处理n*n 最后减去n-1
要注意中间相乘
代码如下
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define mod 998244353
#define ll long long
const int maxn= 100005;
ll c[maxn];
struct Node
{
ll a;
ll p;
} node[maxn];
ll d[maxn];
ll n;
ll lowbit(ll k)
{
return k&(-k);
}
ll pow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)
{
res=res*a%mod;
}
b=b>>1;
a=a*a%mod;
}
return res;
}
ll query(ll k)
{
// cout<<k<<endl;
ll sum=1;
while(k<=n)
{
sum=sum*c[k]%mod;
//cout<<c[k]<<endl;
k+=lowbit(k);
}
return sum;
}
void update(ll a,ll b)
{
while(a>0)
{
c[a]=c[a]*b%mod;
a-=lowbit(a);
}
return;
}
int main()
{
ll inv=pow(100,mod-2);
while(~scanf("%lld",&n))
{
for(int i=1; i<=n; i++)
{
c[i]=1;
scanf("%lld%lld",&node[i].p,&node[i].a);
d[i-1]=node[i].a;
}
sort(d,d+n);
ll cnt=unique(d,d+n)-d;
for(int i=1; i<=n; i++)
{
node[i].a=upper_bound(d,d+cnt,node[i].a)-d+1;
printf("%lld\n",node[i].a);
}
ll ans=0;
for(int i=1; i<=n; i++)
{
ans=(ans+query(node[i].a)*node[i].p%mod*inv)%mod;
update(node[i].a,(100-node[i].p)*inv%mod);
}
printf("%lld\n",ans);
}
}