AtCoder Grand Contest 025

A:

题意:给定一个数KK,求正整数A,BA,B使得A+B=KA+B=K且A,BA,B 各位数字之和最小,输出最小的各位数字之和

题解:暴力

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <map>
using namespace std;
int n;

int solve(int a)
{
    int sum=0;
    while(a>0)
    {
        sum+=a%10;
        a/=10;
    }
    return sum;
}

int main()
{
    int i;
    int ans=0x7fffffff;
    scanf("%d",&n);
    for(i=1;i<=n/2+1;i++)
    {
        int tmp=solve(i)+solve(n-i);
        ans=min(ans,tmp);
    }
    printf("%d\n",ans);
    return 0;
}
View Code

B:

题意:给一张n个格子的纸,然后涂色,红色的权值为A,蓝色的权值为B,绿色的权值为A+B,不涂色权值为0,要求给纸涂色使得这张纸的权值之和为K,求涂色方案数%998244353。

解法:枚举A的数量,然后算出B的数量,判断可不可以将这些A和B放进这些格子,然后组合数

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <map>
using namespace std;
const long long mod=998244353;
long long fac[300010],inv[300010];
long long ai,bi,k;
int n;

long long qp(long long p,long long q)
{
    long long cnt=1;
    while(q>0)
    {
        if(q%2==1) cnt=(cnt*p)%mod;
        q/=2;
        p=(p*p)%mod;
    }
    return cnt%mod;
}

long long C(long long a,long long b)
{
    long long tmp=(fac[a]*inv[b])%mod*inv[a-b];
    return tmp%mod;
}

void init()
{
    int i;
    fac[0]=1;
    inv[0]=1;
    for(i=1;i<=n;i++)
    {
        fac[i]=(fac[i-1]*i)%mod;
        inv[i]=qp(fac[i],mod-2);
    }
}

int main()
{
    int i,j;
    scanf("%d%lld%lld%lld",&n,&ai,&bi,&k);
    init();
    long long ans=0;
    for(i=0;i<=n;i++)
    {
        if((k-ai*i)<0) continue;
        if((k-ai*i)%bi!=0) continue;
        long long num=(k-ai*i)/bi;
        if(num>(long long)n) continue;
        long long tmp=C(n,i)*C(n,num);
        ans=(ans+tmp)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 

posted @ 2018-06-05 20:30  Hetui  阅读(192)  评论(0编辑  收藏  举报