zoukankan      html  css  js  c++  java
  • [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
    ",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
    ",ans); return 0;
    }
  • 相关阅读:
    c_水程序
    Arlenmbx!!!!
    java
    c语言随机函数&&时间函数
    2016省赛总结
    666
    【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)
    【洛谷P3756】[CQOI2017]老C的方块(最小割)
    CF704D Captain America(上下界网络流)
    AtCoder Regular Contest 097
  • 原文地址:https://www.cnblogs.com/rrsb/p/8480886.html
Copyright © 2011-2022 走看看