AtCoder Grand Contest 025
A:
题意:给定一个数KK,求正整数A,BA,B使得A+B=KA+B=K且A,BA,B 各位数字之和最小,输出最小的各位数字之和
题解:暴力
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
B:
题意:给一张n个格子的纸,然后涂色,红色的权值为A,蓝色的权值为B,绿色的权值为A+B,不涂色权值为0,要求给纸涂色使得这张纸的权值之和为K,求涂色方案数%998244353。
解法:枚举A的数量,然后算出B的数量,判断可不可以将这些A和B放进这些格子,然后组合数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }