bzoj 4872: [Shoi2017]分手是祝愿 期望dp

code: 

#include <bits/stdc++.h>    
#define N 100005           
#define mod 100003   
#define LL long long     
#define setIO(s) freopen(s".in","r",stdin)        
using namespace std;
LL fac[N],inv[N],dp[N];    
int sta[N],v[N]; 
LL qpow(LL x,LL y) 
{
    LL tmp=1ll; 
    for(;y;y>>=1,x=x*x%mod)  if(y&1)    tmp=tmp*x%mod;    
    return tmp;    
}   
LL Inv(LL x) { return qpow(x,mod-2);   }
int main() 
{
    // setIO("input");           
    int i,j,n,k,stp=0; 
    scanf("%d%d",&n,&k);
    fac[0]=inv[0]=1ll;       
    for(i=1;i<=n;++i)    fac[i]=fac[i-1]*1ll*i%mod,inv[i]=Inv(fac[i]);      
    for(i=1;i<=n;++i)    scanf("%d",&sta[i]);              
    for(i=n;i>=1;--i) 
    { 
        sta[i]^=v[i];   
        if(sta[i]) 
        {
            ++stp;                           
            for(j=1;j*j<=i;++j)  if(i%j==0) 
            { 
                v[j]^=1;          
                if(j!=i/j)  v[i/j]^=1;               
            }
        }
    }                            
    // printf("%d\n",stp);              
    // dp[n]=1;   
    for(i=n;i>=1;--i) dp[i]=(dp[i+1]*1ll*(n-i)%mod+n)%mod*qpow(i,mod-2)%mod;          
    LL ans=0ll;  
    if(stp<=k)  ans=stp;      
    else 
    {    
        for(i=stp;i>k;--i) ans=(ans+dp[i])%mod;                                   
        ans=(ans+k)%mod;   
    }  
    for(i=1;i<=n;++i)    ans=ans*1ll*i%mod;   
    printf("%lld\n",ans);    
    return 0;    
}

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/11773220.html