건초 진자
이탈리아 그 : N에 1이 배열 Q의 암송이 갖는 각 섹션 (L)의 최소값을 제공 ~ Ra는, Q 모순 문 제 이전 번호.
\ (1 \ 당량의 N \ 당량의
10 ^ 6의 Q \의 당량 25000 \) 해결책 : 진 않음. 교차점의 큰 부분이 어떤 작은 범위를 포함하고 있으면 특정 세트는 모순된다.
관계는 이산 세트 또는 세그먼트 트리를 포함 할 수있다(연결되지 않은-true로 설정 암 아)
세그먼트 트리 잡담. 디스 조인트 세트는 다음 [L, R은 상기 부모 노드 간격 R + 1에 힘이 적용되는 경우. 발견 (난)> r에 경우는 간격이 이상 덮여 증명한다.(좋은 형이상학 아) (xgzc에서 동일하게 보여 약간의 복잡성을 공유 할 수 있습니다)
복잡성 : \ (O (Q의 \의 Q * 로그인 \ 알파 (N-)) \)
#include<bits/stdc++.h>
using namespace std;
#define maxn 25005
struct Query
{
int l,r,v;
inline friend bool operator < (Query a,Query b)
{
return a.v>b.v;
}
}query[maxn],tmp[maxn];
int fa[1000005],n;
inline int findf(int x)
{
return (fa[x]==x)?x:(fa[x]=findf(fa[x]));
}
bool check(int x)
{
for(int i=1;i<=x;++i) tmp[i]=query[i];
for(int i=1;i<=n+1;++i) fa[i]=i;
sort(tmp+1,tmp+x+1);
int l1,l2,r1,r2;
l1=l2=tmp[1].l,r1=r2=tmp[1].r;
for(int i=2;i<=x;++i)
{
if(tmp[i].v<tmp[i-1].v)
{
if(findf(l1)>r1) return false;
for(int j=fa[l2];j<=r2;j=fa[j])
{
findf(j);
fa[j]=findf(j+1);
}
l1=l2=tmp[i].l,r1=r2=tmp[i].r;
}
else
{
l1=max(l1,tmp[i].l),l2=min(l2,tmp[i].l);
r1=min(r1,tmp[i].r),r2=max(r2,tmp[i].r);
if(r1<l1) return false;
}
}
if(findf(l1)>r1) return false;
return true;
}
int main()
{
freopen("bales.in","r",stdin),freopen("bales.out","w",stdout);
int q;
scanf("%d%d",&n,&q);
for(int i=1;i<=q;++i)
scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].v);
int l=1,r=q+1,mid;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid;
}
printf("%d\n",l>q?0:l);
return 0;
}
B 세이버
표제 의미 주어진 \ (n 개 * m 개의 \) 트 렐리 스 다이어그램 (\. Y = X + 1 \) 좌상 점 만 위쪽으로 또는 오른쪽으로 전체 (온라인)을 가지, Q (0, 0) 내지 (N, M)에 디지털 19,999,999 경로 부 아날로그한다. \ (2 \ 당량 m의 \ 당량의
N 개의 \ 당량의 10 ^ {10} \) 해결책 : 프로그램 번호 부정이라고. 물론 이러한 모든 경로가 광고 할 수 \ (Y = X \ + 2 ) 오른쪽 하단에서 스크롤의 상부 좌측에 외부 경로를 따라, 즉, 행 (0,0) (m-2, N + 2 ) 방식 수. 그래서 \ (ANS = C_ {N +
m} ^ {m} -C_ {N + m} ^ {m-2} \) 루카스에 작은 계수로 인해.
복잡성 : \ (O (MOD) \)
#include<bits/stdc++.h>
using namespace std;
#define mod 19999999
#define ll long long
ll inv[mod+5],fac[mod+5];
inline void exgcd(ll a,ll b,ll& x,ll& y)
{
if(!b)
{
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline void pre(int x)
{
inv[0]=fac[0]=1;
for(int i=1;i<=x;++i)
fac[i]=fac[i-1]*i%mod;
ll tx,ty;
exgcd(fac[x],mod,tx,ty);
inv[x]=(tx%mod+mod)%mod;
for(int i=x-1;i;--i)
inv[i]=(i+1)*inv[i+1]%mod;
}
inline ll c(ll x,ll y)
{
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
inline ll lucas(ll x,ll y)
{
return c(x%mod,y%mod)*c(x/mod,y/mod)%mod;
}
int main()
{
freopen("saber.in","r",stdin),freopen("saber.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
pre((n+m+2)%mod);
printf("%lld\n",(lucas(n+m,m)-lucas(n+m,m-2)+mod)%mod);
return 0;
}
C는 충분하지 않았어
그 이탈리아 : 질문에 대한 긴 브러시입니다. 그는 그것을하지 않습니다.
N이 주어 찾을
\ [\ sum_을 {I = 1 } ^ {N} \ sum_ {J = 1} ^ {N} \ sum_ {K = 1} ^ {N} {[J \ 미드 I] (j K +) \ 미드 I]}
\ 개조 998,244,353 \] 상기 \가 ([X] \) x는 1 경우 또는 값이 참은 0. (\ n 개의 \의 당량 107 \
^) 해결책 : 분명히 \ (ANS = \ sum_ {I = 1} ^ {N} {\ FRAC {D (I) ^ 2-D (I)} {2}} \) , D는 계수의 개수의 함수이다.
선형 화면이 될 수 있습니다.
복잡성 : \ (O (N-) \)
#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define maxn 10000005
int n,vis[maxn],id[maxn],num[maxn],prime[1000005],cnt;
inline void eular(int x)
{
int tmp;
for(int i=2;i<=x;++i)
{
if(!vis[i]) prime[++cnt]=i,id[i]=2,num[i]=1;
for(int j=1;j<=cnt&&i*prime[j]<=x;++j)
{
tmp=i*prime[j];
vis[tmp]=1;
if(i%prime[j])
{
id[tmp]=2*id[i];
num[tmp]=1;
}
else
{
id[tmp]=id[i]*(num[i]+2)/(num[i]+1);
num[tmp]=num[i]+1;
break;
}
}
}
}
int main()
{
freopen("good.in","r",stdin),freopen("good.out","w",stdout);
scanf("%d",&n);
eular(n+2);
long long ans=0;
int tmp;
for(int i=1;i<=n;++i)
{
tmp=id[i];
ans+=((tmp*tmp-tmp)>>1)%mod;
ans%=mod;
}
printf("%lld\n",ans);
return 0;
}
D는 큰 재산 숨막히는
길고 hyj 게임 문제를 수행 이탈리아 있음을. N-1-질문 번호 2 ~ N이 있습니다. 각 질문은 한 사람에 의해 수행 (또는 아무도하지 않았다) 할 수 있습니다. 질문을하고부터 길고 hyj 수요는 두 숫자는 프로그램의 수에 주요하지 않은 선정되었다. 두 사람이 의문을 제기 할 수 없다. 모듈로 P의 프로그램 번호. (\ n 개의 \의 당량 500, P는
\ 당량의 10 ^ 9 \) 해결책 : 압력 형 \ (\ SQRT n \) 세트 내의 소수. 세트 \ (DP는 [I]는 [j는 ] \) I의 주요 요소의 세트로부터 선택 용의 개수를 나타내고,는 hyj 군 J로부터 선택된다. 이러한 방법으로 큰 소수를 남겨 (수). 세트 \ (F1 [I] [J ] [K], F2 [I] [J] [K] \) 나타내며, i 번째 프로그램의 두 집합으로부터 선택된 후보 J, K, 큰 소수의 개수는 .
두 배열 초기 값 (DP).
전송하는 \ (F1 [I] [J \ S MID] [K] + = F1 [I] [J] [K] (S \ & K == 0) \) . 또 다른 공감.
\ (ANS = \ sum_ {I
= 0} \ {sum_ J = 0} {DP [I] [J]} \) 나 그렇지 롤아웃 MLE 원하는 참고.
복잡성 : \. (O (N-2 * 2 ^ * ^ 8.8) \) (사람의 비 \ (\ SQRT n \) 작은 소수 제 (19), 8)
#include<bits/stdc++.h>
using namespace std;
struct Num
{
int s,num;
inline friend bool operator < (Num a,Num b)
{
if(a.num==b.num) return a.s<b.s;
return a.num<b.num;
}
}num[505];
int prime[9]={0,2,3,5,7,11,13,17,19};
int n,p,dp[257][257],tmp[2][257][257],ans;
inline void add(int& a,const int& b)
{
a=(a+b)%p;
}
int main()
{
freopen("rich.in","r",stdin),freopen("rich.out","w",stdout);
scanf("%d%d",&n,&p);
int tn;
for(int i=2;i<=n;++i)
{
tn=i;
for(int j=1;j<=8;++j)
{
if(tn%prime[j]) continue;
num[i].s|=(1<<(j-1));
while(!(tn%prime[j])) tn/=prime[j];
}
num[i].num=tn;
}
sort(num+2,num+n+1);
dp[0][0]=1;
for(int i=2;i<=n;++i)
{
if(i==2||num[i].num==1||num[i].num xor num[i-1].num)
memcpy(tmp[1],dp,sizeof(dp)),memcpy(tmp[0],dp,sizeof(dp));
for(int j=255;j>=0;--j)
for(int k=255;k>=0;--k)
{
if(!(k&num[i].s)) add(tmp[0][j|num[i].s][k],tmp[0][j][k]);
if(!(j&num[i].s)) add(tmp[1][j][k|num[i].s],tmp[1][j][k]);
}
if(i==n||num[i].num==1||num[i].num xor num[i+1].num)
for(int j=0;j<=255;++j)
for(int k=0;k<=255;++k)
dp[j][k]=((tmp[0][j][k]+tmp[1][j][k]-dp[j][k])%p+p)%p;
}
for(int i=255;i>=0;--i)
for(int j=255;j>=0;--j)
if(!(i&j)) add(ans,dp[i][j]);
printf("%d\n",ans);
return 0;
}