IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    HDUOJ 1271

    ReiAC\'s Blog发表于 2021-01-08 18:22:46
    love 0

    其实是一道大水题,但是自己写的时候一开始居然没想到去枚举k就可以了,确实不擅长做数学题

    证明

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    
    #include<bits/stdc++.h>
    //#include<bits/extc++.h>
    #define int long long
    //#define int __int128
    #define ull unsigned long long
    #define mmst0(x) memset(x,0,sizeof(x))
    
    using namespace std;
    //using namespace __gnu_pbds;
    
    const int INF=0x3f3f3f3f;
    
    int read(){char c;int num,f=1;while(c=(char)getchar(),!isdigit(c))if(c=='-')f=-1;num=(int)(c-'0');while(c=(char)getchar(),isdigit(c))num=num*10+(int)(c-'0');return num*f;}
    void prt(int x){if(x<0){putchar('-');x=-x;}if(x>9)prt(x/10);putchar((char)(x%10+'0'));}
    
    int n,a,b,c;
    int t[10000];
    
    void work()
    {
        while(n=read())
        {
            int cnt=0;
            for(int k=1;k<=n;k*=10)//枚举k,此处k为10^k
            {
                c=(n/k)/11;//去掉了后面k未之后就剩下前几位,即为c;
                b=n/k-c*11;//前k位减去11c就是b
                if((b!=0 || c!=0) && b<10)//b<10是存在进位
                {
                    a=(n-b*k-11*c*k)/2;
                    if(2*a+b*k+11*c*k==n) 
                        t[++cnt]=a+b*k+c*k*10;
                }
                b--;
                if((b!=0 || c!=0) && b>=0)
                {
                    a=(n-b*k-11*c*k)/2;
                    if(2*a+b*k+11*c*k==n) 
                        t[++cnt]=a+b*k+c*k*10;
                }
            }
    
            if(!cnt)
            {
                printf("No solution.\n");
            }
            else
            {
                sort(t+1,t+1+cnt,[](int a,int b){
                    return a<b;
                });
                printf("%d",t[1]);
                for(int i=2;i<=cnt;i++) if(t[i]!=t[i-1]) printf(" %d",t[i]);
                printf("\n");
            }
        }
        return;
    }
    
    /*
    N=2a+b*10^k+11c*10^k
    */
    signed main()
    {
        //ios::sync_with_stdio(false);cin.tie(NULL);
        int T=1;//read();
        for(int Case=1;Case<=T;Case++)
        {
            //printf("Case #%d: ",Case);
            work();
        }
        return 0;
    }
    


沪ICP备19023445号-2号
友情链接