【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; }
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; }
戒骄戒躁