2020-6-19

今天这道题又误入歧途了

问题 H: 357数

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

小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: 二项式展开

时间限制: 1 Sec  内存限制: 512 MB
提交 状态

题目描述

夏令营后,小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;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值