1. 程式人生 > >[Atcoder Regular Contest 060] Tutorial

[Atcoder Regular Contest 060] Tutorial

sts type link b- nbsp target AD SQ isp

Link:

ARC060 傳送門

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:

剩下的待填……

[Atcoder Regular Contest 060] Tutorial