hdu5389 Zero Escape

43 9 11 2 63 9 12 3 35 2 31 1 1 1 19 9 9

1 2 3 4 5 6 7 8 9

这题关键是要发现定义的运算,起结果和该数%9的结果是一样的,然后可以开个数组dp[i][j](j属于0~8)表示前i个数能选出的数的和%9后为j的方案数,然后dp[i][j]=dp[i-1][j]以及dp[i][(j+c[i]%9)%9]=(dp[i][(j+c[i]%9)%9]+dp[i-1][j])%258280327。dp[]的过程中相当于把9当做0,注意dp的初始化,不然会出错。

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<string>#include<algorithm>using namespace std;#define ll long longint c[100060];int dp[1000060][10];int main(){int n,m,i,j,T,a,b,sum,t1,t2,t,ans;scanf("%d",&T);while(T–){scanf("%d%d%d",&n,&a,&b);sum=0;for(i=1;i<=n;i++){scanf("%d",&c[i]);sum+=c[i];}if(sum%9!=(a%9+b%9)%9 && sum%9!=a%9 && sum%9!=b%9){printf("0\n");continue;}t1=a%9;t2=b%9;t=sum%9;dp[0][0]=1;for(i=1;i<=n;i++){for(j=0;j<=8;j++){dp[i][j]=dp[i-1][j];}for(j=0;j<=8;j++){dp[i][(j+c[i]%9)%9]=(dp[i][(j+c[i]%9)%9]+dp[i-1][j])%258280327;}}if((t1+t2)%9!=t){if(t1==t && t2==t){printf("2\n");continue;}printf("1\n");continue;}printf("%d\n",dp[n][a%9]);}return 0;}

,酒般的思念,一饮就醉,醉时就用全部的热情读这忧伤的月色,

hdu5389 Zero Escape

相关文章:

你感兴趣的文章:

标签云: