1. 程式人生 > >【ACM-ICPC 2018 沈陽賽區網絡預賽 K】Supreme Number

【ACM-ICPC 2018 沈陽賽區網絡預賽 K】Supreme Number

string ase -a pri 位數 整除 while ant efi

【鏈接】 我是鏈接,點我呀:)
【題意】


在這裏輸入題意

【題解】


顯然每個數字只可能是1,3,5,7
然後如果3,5,7這些數字出現兩次以上。顯然兩個3||5||7都能被11整除。
然後1的話最多能出現兩次。
那麽也就是說最多只可能有5位數字。
把小於等於5位的全都枚舉一遍。求出合法的就好。
如果n>=5位就直接輸出那個最大的就Ok.

【代碼】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x)
#define rson mid+1,r,rt<<1|1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
int ans[]= {2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317};
string s;
int kk = 1;

int main()
{
    int t;
    scanf("%d",&t);

    while(t--)
    {
        string s;
        cin>>s;
        LL n=0;
        rep1(i,0,(int)s.size()-1){
            n=n*10+s[i]-'0';
            if(n>317)break;
        }

        printf("Case #%d: ",kk++);
        if(n>317)puts("317");
        else
        {
             int x=lower_bound(ans,ans+19,n)-ans;
             if(ans[x]>n)x--;
             printf("%d\n",ans[x]);
        }

    }
}

【ACM-ICPC 2018 沈陽賽區網絡預賽 K】Supreme Number