Link:
C:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=55; int n,a,sum,dat[MAXN]; ll dp[MAXN][MAXN][MAXN*MAXN],res=0; int main() { scanf("%d%d",&n,&a); for(int i=1;i<=n;i++) scanf("%d",&dat[i]); dp[1][1][dat[1]]=1;sum=dat[1]+dat[2]; for(int i=1;i<=n;i++) dp[i][0][0]=1; for(int i=2;i<=n;i++,sum+=dat[i]) for(int j=1;j<=i;j++) for(int k=1;k<=sum;k++) { dp[i][j][k]=dp[i-1][j][k]; if(k>=dat[i]) dp[i][j][k]+=dp[i-1][j-1][k-dat[i]]; } for(int i=1;i<=n;i++) res+=dp[n][i][i*a]; printf("%lld",res); return 0; }
O(n^4)
#include <bits/stdc++.h> using namespace std; const int MAXN=51,ZERO=2550; typedef long long ll; int n,a,x,cur; ll dp[2][2*ZERO]; int main() { scanf("%d%d",&n,&a); dp[cur^1][ZERO]=1; for (int i=1;i<=n;i++,cur^=1) { scanf("%d",&x);x-=a; for (int j=MAXN;j+MAXN<2*ZERO;j++) dp[cur][j]=dp[cur^1][j]+dp[cur^1][j-x]; } printf ("%lld\n",dp[cur^1][ZERO]-1); }
O(n^3)
D:
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,s,sq; bool check(ll b) { ll ret=0,t=n; for(;t;t/=b) ret+=t%b; return (ret==s); } ll solve() { if(s==n) return n+1; //s=1时不特殊处理 if(s>n) return -1; for(int i=2;i<=sq;i++) if(check(i)) return i; for(int i=sq;i;i--) //注意枚举顺序 if((n-s)%i==0&&check((n-s)/i+1)) return ((n-s)/i+1); return -1; } int main() { scanf("%lld%lld",&n,&s);sq=sqrt(n); printf("%lld",solve()); return 0; }
Problem D
E:
F:
剩下的待填……
原文地址:https://www.cnblogs.com/newera/p/9253364.html
时间: 2024-11-09 00:58:50