hdu 3481 3482
Good Serial Inc.比较简单;
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000009 #define ll long long using namespace std; const ll mod=987654321; ll f[maxn]; int main() { ll n,m; f[1]=1; for(ll i=2;i<maxn-1;i++) { f[i]=f[i-1]*i; if(f[i]>mod)f[i]%=mod; } while(scanf("%lld%lld",&n,&m)&&(n+m)>0) { ll ans=1; if(n<m||m==1||m==2) { while(n>0) { if(n&1)ans*=m; if(ans>mod)ans%=mod; n>>=1; m*=m; if(m>mod)m%=mod; } } else { ans=f[m]+m; if(ans>mod)ans%=mod; } printf("%lld\n",ans); } return 0; }
Bad Serial Inc.稍微复杂点,但是还是比较好理解的;
dp[i][j]表示长度为i的数组最后j位相同的数目;
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define maxn 109 #define ll long long #define mod 987654321 using namespace std; ll dp[maxn][11]; int main() { ll n,m; while(scanf("%lld%lld",&n,&m)&&(n+m)>0) { if(m==1){puts("0");continue;} if(m==2) { if(n==1)puts("2"); else puts("0"); continue; } memset(dp,0,sizeof dp); dp[1][1]=m; for(int i=1;i<=n;i++) { for(int j=1;j<m;j++) { if(dp[i][j]>mod)dp[i][j]%=mod; dp[i+1][j+1]+=dp[i][j]*(m-j);//后一位与前j位都不相同 for(int k=2;k<=j;k++) dp[i+1][k]+=dp[i][j];//后一位与前j位的某一位相同 if(j>1||i==1) { for(int k=1;k<m-1;k++) dp[i+k][1]+=dp[i][j];//连续多少位相同 } } } ll ans=0; for(int i=1;i<m;i++) ans+=dp[n][i]; cout<<ans%mod<<endl; } return 0; }