Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/STACK:65777216")
- #include <iostream>
- #include <iomanip>
- #include <cstdlib>
- #include <ctime>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <stack>
- #include <map>
- #include <queue>
- #include <string>
- #include <memory.h>
- #include <iterator>
- #define mem(A,X) memset(A,X,sizeof(A))
- #define memo(A) memset(A,0,sizeof(A))
- #define forn(I,B) for (int I=1;I<=(B);I++)
- #define forg(H,V) for (int H=first[V];h;h=next[H])
- #define rep(I,B) for (int I=0;I<(B);I++)
- #define labs(X) (((X)>0)?(X):(-(X)))
- #define ropen(X) freopen(X,"r",stdin)
- #define wopen(X) freopen(X,"w",stdout)
- #define pb push_back
- #define mp make_pair
- #define all(X) (X).begin(),(X).end()
- #define sqr(X) ((X)*(X))
- using namespace std;
- typedef pair <int,int> pii;
- typedef pair <long long,long long> pll;
- typedef double ld;
- typedef long long ll;
- typedef vector<int> vi;
- const int N=41;
- const ll P=1000000000;
- const int INF=111111111;
- const double eps=1e-9;
- const double pi=3.14159265358979;
- class bigint{
- public:
- int sz;
- ll a[N];
- bigint(ll x=0){
- memset(a,0,sizeof(a));
- sz=0;
- while (x){
- a[++sz]=x%P;
- x/=P;
- }
- if (!sz) ++sz;
- }
- void print(){
- printf("%I64d",a[sz]);
- for (int i=sz-1;i>=1;i--) printf("%.9I64d",a[i]);
- }
- friend ostream& operator << (ostream& output, bigint & q){
- q.print();
- return output;
- }
- ll & operator [] (int x){
- return a[x];
- }
- friend bool operator < (bigint & p,bigint &q){
- if (p.sz<q.sz) return 1;
- if (p.sz>q.sz) return 0;
- for (int i=p.sz;i;i--){
- if (p[i]>q[i]) return 0;
- if (p[i]<q[i]) return 1;
- }
- return 0;
- }
- friend bool operator == (bigint & p,bigint & q){
- return !(p<q) && !(q<p);
- }
- friend bool operator != (bigint & p, bigint & q){
- return p<q || q<p;
- }
- friend bool operator >= (bigint & p,bigint & q){
- return !(p<q);
- }
- friend bool operator <= (bigint &p, bigint & q){
- return !(q<p);
- }
- friend bool operator > (bigint &p, bigint & q){
- return q>p;
- }
- friend bigint operator + (bigint &a,bigint &b){
- bigint res;
- int n=max(a.sz,b.sz);
- for (int i=1;i<=n;i++){
- res[i]=a[i]+b[i]+res[i];
- res[i+1]=res[i]/P;
- res[i]%=P;
- }
- if (res[n+1]) ++n;
- res.sz=n;
- return res;
- }
- friend bigint operator * (bigint &a,bigint &b){
- bigint res;
- int n=a.sz,m=b.sz,k=n+m-1;
- for (int i=1;i<=n;i++)
- for (int j=1;j<=m;j++){
- res[i+j-1]=a[i]*b[j]+res[i+j-1];
- res[i+j]+=res[i+j-1]/P;
- res[i+j-1]%=P;
- }
- if (res[k+1]) ++k;
- res.sz=k;
- return res;
- }
- friend bigint operator - (bigint &a,bigint &b){
- bigint res;
- int k=a.sz;
- for (int i=1;i<=k;i++){
- res[i]+=a[i]-b[i];
- if (res[i]<0){
- res[i]+=P;
- res[i+1]--;
- }
- }
- while (res[k]==0) --k;
- res.sz=k;
- return res;
- }
- friend void operator -=(bigint &p,bigint & q){
- p=p-q;
- }
- friend void operator +=(bigint &p,bigint & q){
- p=p+q;
- }
- friend void operator *=(bigint &p, bigint & q){
- p=p*q;
- }
- friend bigint operator ^ (bigint & p, int y){
- bigint x=p,res=1;
- while (y){
- if (y&1) res*=x;
- y>>=1;
- x*=x;
- }
- return res;
- }
- };
- bigint f[51][451];
- int n,s;
- int main(){
- scanf("%d%d",&n,&s);
- if ((s&1) || s>900){
- printf("0\n");
- return 0;
- }
- if (s==1){
- printf("1\n");
- return 0;
- }
- s/=2;
- f[0][0]=1;
- forn(i,n) rep(j,s+1) rep(k,10){
- if (k>j) break;
- f[i][j]+=f[i-1][j-k];
- }
- bigint q=f[n][s]*f[n][s];
- cout<<q<<endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment