今天这道题又误入歧途了
问题 H: 357数
题目描述
小Y把由至少一个3,5,7组成的,并且只由3,5,7组成的数称为357数。
请问少于n的357数有多少个。输入
一个整数n(1≤n≤2000000000)
输出
一个整数,表示有多少个357数小于n。
样例输入 Copy
3600
样例输出 Copy
13
GPLv2 lic
你可以思考一下3557这个数字,不能产生
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
queue<ll>q;
ll fun(ll n,ll m)
{
while(n)
{
n/=10;
m*=10;
}
return m;
}
map<ll,int>mp;
int main()
{
ll n;
cin>>n;
int num=0;
if(357<=n)
num++,q.push(357),printf("%d 357\n",num);
if(375<=n)
num++,q.push(375),printf("%d 375\n",num);
if(537<=n)
num++, q.push(537),printf("%d 537\n",num);
if(573<=n)
num++,q.push(573),printf("%d 573\n",num);
if(735<=n)
num++, q.push(735),printf("%d 735\n",num);
if(753<=n)
num++,q.push(753),printf("%d 753\n",num);
while(!q.empty())
{
ll temp=q.front();
q.pop();
ll k=temp*10+3;
if(k<=n)
{
if(mp[k]==0)
{
q.push(k);
num++;
mp[k]=1;
printf("%d %lld\n",num,k);
}
// printf("%d %lld\n",num,k);
}
ll kk=fun(temp,3)+temp;
if(kk<=n)
{
if(mp[kk]==0)
{
q.push(kk);
num++;
mp[kk]=1;
printf("%d %lld\n",num,kk);
}
// printf("%d %lld\n",num,kk);
}
k=temp*10+5;
if(k<=n)
{
if(mp[k]==0)
{
q.push(k);
num++;
mp[k]=1;
printf("%d %lld\n",num,k);
}
//printf("%d %lld\n",num,k);
}
kk=fun(temp,5)+temp;
if(kk<=n)
{
if(mp[kk]==0)
{
q.push(kk);
num++;
mp[kk]=1;
printf("%d %lld\n",num,kk);
}
// printf("%d %lld\n",num,kk);
}
k=temp*10+7;
if(k<=n)
{
if(mp[k]==0)
{
q.push(k);
num++;
mp[k]=1;
printf("%d %lld\n",num,k);
}
// printf("%d %lld\n",num,k);
}
kk=fun(temp,7)+temp;
if(kk<=n)
{
if(mp[kk]==0)
{
q.push(kk);
num++;
mp[kk]=1;
printf("%d %lld\n",num,kk);
}
//printf("%d %lld\n",num,kk);
}
}
cout<<num;
return 0;
}
正解
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[]={0,3,5,7};
int e[200]={0};
typedef long long ll;
ll sum1=0;
ll n;
int q(int k,int m)
{
if(k>m)
{
int flag1=0,flag2=0,flag3=0;
ll sum=0;
for(int i=1;i<=m;i++)
{
sum=sum*10+a[e[i]];
if(e[i]==1)
flag1=1;
if(e[i]==2)
flag2=1;
if(e[i]==3)
flag3=1;
}
if(sum<=n&&flag1&&flag2&&flag3)
{
sum1++;
}
return 0;
}
for(int i=1;i<=3;i++)
{
e[k]=i;
k++;
q(k,m);
k--;
}
}
int main()
{
cin>>n;
int w=log10(n)+1;
for(int i=1;i<=w;i++)
q(1,i);
cout<<sum1<<endl;
return 0;
}
问题 G: 二项式展开
题目描述
夏令营后,小y就在学习林老师的《数学一本通》。在《组合数学》那一章发现这样一个问题,在整式的乘法中,有:(a+b)1=a+b,(a+b)2=a2+2ab+b2,…
等等,这些都可以用简单的手算求得。但是他想如果要求(a+b)n的展开式,就不容易很快手算了。
现在,他需要你和他一起编程解决这个问题。
输入
输入一行一个整数n。
输出
输出一行一个完整的表达式。
格式为:(a+b)^n=*a^n+*a^(n-1)b+*a^(n-2)b^2+…+*b^n
其中:“*”为系数,如果系数为1,则需要省略系数;如果次数为1,则需要省略次数;如果次数为0,则需要省略;如果系数为0,则需要省略这一项。
注意:前面(a+b)^n的次数是必有的,表达式的任何地方都不能有多余空格。
样例输入 Copy
5
样例输出 Copy
(a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5
提示
对于30%的数据满足:n<=18;
对于60%的数据满足:n<=34;
对于100%的数据满足:1<=n<=67。
GPLv2
这道题,91分了,但是不想改了,就是用高精度处理n=67的情况,emmm应该是一个矩阵,看网上弄的。当然有个偷懒的方法就是单独把67高精度出来,其实就是套个模板进去
#include <bits/stdc++.h> using namespace std; typedef long long ll; queue<ll>q; int n; ll C[100][100]; void init() { for(int i=1; i<=n; i++) C[i][1]=i,C[i][i]=1,C[i][0]=1; for(int i=1; i<=n; i++) { for(int j=2; j<=i; j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; } } int main() { cin>>n; printf("(a+b)^%d=",n); init(); // for(int i=1;i<=n;i++) //{ //for(int j=0;j<=i;j++) //printf("C%d %d=%lld\n",i,j,C[i][j]); //} for(int i=n; i>=0; i--) { if(C[n][i]==1&&i!=0) { if(i!=1) printf("a^%d",i); else printf("a"); } else if(i!=0) { if(i!=1) printf("%llda^%d",C[n][i],i); else printf("%llda",C[n][i]); } if(i!=n) { if(n-i!=1) printf("b^%d",n-i); else printf("b"); } if(i>0) printf("+"); } return 0; } /************************************************************** Problem: 15553 User: 2019UPC110 Language: C++ Result: 答案错误 ****************************************************************/
感谢好心人的评论,之前试过ull,但是输出没注意,导致依然爆了,后面检查尝试了一下,正确了,看到上面自己写的,突然有点羞愧。
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; queue<ll>q; int n; ull C[100][100]; void init() { for(int i=1; i<=n; i++) C[i][1]=i,C[i][i]=1,C[i][0]=1; for(int i=1; i<=n; i++) { for(int j=2; j<=i; j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; } } int main() { cin>>n; printf("(a+b)^%d=",n); init(); // for(int i=1;i<=n;i++) //{ //for(int j=0;j<=i;j++) //printf("C%d %d=%lld\n",i,j,C[i][j]); //} for(int i=n; i>=0; i--) { if(C[n][i]==1&&i!=0) { if(i!=1) printf("a^%d",i); else printf("a"); } else if(i!=0) { if(i!=1) cout<<C[n][i],printf("a^%d",i); else cout<<C[n][i]<<'a'; } if(i!=n) { if(n-i!=1) printf("b^%d",n-i); else printf("b"); } if(i>0) printf("+"); } return 0; }