[Shoi2017]分手是祝愿

Posted 殇雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Shoi2017]分手是祝愿相关的知识,希望对你有一定的参考价值。

题链

我们可以从大到小搞一搞,那么就有50分了。

然后我们可以证明,这个方案是最优方案脑残选错几次再把选错的几次取消。

因为在每个点最多选一次的情况下解唯一。

那么就可以对最优方案列DP,然后PaPaPa。

#include<bits/stdc++.h>
#define mo 100003
#define pb push_back
#define LL long long
using namespace std;
int n,k,a[mo];
LL inv[mo],f[mo],ans,anw;
vector<int> v[mo];
int  main () {
    freopen("trennen.in","r",stdin);
    freopen("trennen.out","w",stdout);
    scanf("%d %d",&n,&k);
    for (int i=1;i<=n;i++) scanf("%d",a+i);
    inv[1]=1;
    for (int i=2;i<mo;i++) inv[i]=(mo-mo/i)*inv[mo%i]%mo;
    for (int i=1;i<=n;i++) 
     for (int j=i;j<=n;j+=i)  v[j].pb(i);
    for (int i=n;i;i--) if (a[i]){
        for (int j=v[i].size()-1;~j;j--) a[v[i][j]]^=1;
        anw++;
    }
    if (anw<=k) {
        for (int i=1;i<=n;i++) (anw*=i)%=mo;
        printf("%d\n",anw); return 0;}
    f[n]=1;ans=k;
    for (int i=n-1;i>k;i--) f[i]=(1+inv[i]*(1+f[i+1])%mo*(n-i))%mo;
    for (int i=max(k+1,2);i<=anw;i++) ans+=f[i]; ans%=mo;
    for (int i=1;i<=n;i++) (ans*=i)%=mo;
    printf("%lld\n",ans); return 0;
}

 

以上是关于[Shoi2017]分手是祝愿的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4872: [Shoi2017]分手是祝愿

[Shoi2017]分手是祝愿

LOJ #2145. 「SHOI2017」分手是祝愿

loj2145 「SHOI2017」分手是祝愿

bzoj 4872 [Shoi2017]分手是祝愿

bzoj 4872: [Shoi2017]分手是祝愿