【BZOJ1042】硬币购物&&&【UVA11806】

BZOJ1042

全集为每一种货币任意取.

A c1取>=(d[1]+1)张 B c2取>=(d[2]+1)张 C... D...

+0张超次数-1张超次数+2张超次数-3张超次数+4张超次数

#include<bits/stdc++.h>
using namespace std;
const long long v=1e5+99;
long long f[v],d[5],k[5],s,tot,ans;
int main(){
    f[0]=1;
    cin>>d[1]>>d[2]>>d[3]>>d[4]>>tot;
    for(long long i=1;i<=4;i++)
     for(long long j=d[i];j<=v;j++)
     f[j]+=f[j-d[i]]; 
    long long as;
    for(long long i=1;i<=tot;i++)
    {
    ans=0;
    cin>>k[1]>>k[2]>>k[3]>>k[4]>>s;
    for(long long j=0;j<16;j++){
    long long sum=0,az=0;
    if(j&1){sum+=(k[1]+1)*d[1];az++;}
    if(j&2){sum+=(1+k[2])*d[2];az++;}
    if(j&4){sum+=(k[3]+1)*d[3];az++;}
    if(j&8){sum+=(k[4]+1)*d[4];az++;}
    long long ca=s-sum;
    if(ca>=0){
    if(az%2)ans-=f[ca];
    else ans+=f[ca];
}
}
    cout<<ans<<endl;
    }
    return 0;
} 
View Code

 UVA11806

深刻认识到写拍的重要性,最后漏了取模。。。。。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[510][510],n,m,k;
const ll mo=1e6+7;
int main(){
    for(int i=0;i<=505;i++)f[i][0]=1;
    for(int i=1;i<=505;i++)
      for(int j=1;j<=i;j++)
      f[i][j]=(f[i-1][j]+f[i-1][j-1])%mo;
    int x;
    cin>>x;
    for(int t=1;t<=x;t++){
    cin>>n>>m>>k;
    ll ans=0;
    for(int i=0;i<16;i++){
    int az=0;
    int h=n,l=m;
    if(i&1){h--;az++;}
    if(i&2){h--;az++;}
    if(i&4){l--;az++;}
    if(i&8){l--;az++;}
    if(az%2)ans-=f[l*h][k];
    else ans+=f[l*h][k];
    }
    ans=ans%mo;
    while(ans<0)ans+=mo;
    cout<<"Case "<<t<<": "<<ans<<endl;
    }
    return 0;
} 
View Code

 

posted @ 2018-09-16 23:46  周栎  阅读(112)  评论(0编辑  收藏  举报