[蓝桥杯2019初赛]数的分解
题目描述
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。
代码
方法一:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
bool check(int n)
{
stringstream ss;
ss << n;
string t;
ss >> t;
bool f = true;
for(int i = 0; i < t.length(); ++i)
{
if(t[i] == '2' || t[i] == '4')
{
f = false;
break;
}
}
return f;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int ans = 0;
for(int i = 1; 3*i <= 2019; ++i)
{
for(int j = i+1; i+j*2 <= 2019 ; ++j)
{
int k = 2019 - i - j;
if(k <= j)
continue;
if(check(i) && check(j) && check(k))
{
ans ++;
}
}
}
cout << ans;
return 0;
}
方法二
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int num[1000001];
bool vis[1000001],flag;
bool check(int x){
while(x!=0){
if(x%10==2 || x%10==4){
return true;
}
x=x/10;
}
return false;
}
int main() {
int n;
int x,sum=0;
bool flag=false;
for(int i=1;i<=2019;i++){
for(int j=i+1;i+j*2<=2019;j++){
int k=2019-i-j;
flag=false;
if(k<=0) continue;
if(k<=j) continue;
if(!check(i) && !check(j) && !check(k)){
sum++;
}
}
}
cout<<sum;
return 0;
}
答案是:40785