2017CCPC秦皇岛

Posted HAZELNUT MUSEUM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017CCPC秦皇岛相关的知识,希望对你有一定的参考价值。

热身赛

D题 17171771:DFS + Miller_Rabin

Time Limit: 2 Seconds Memory Limit: 65536 KB 17171771 is a sweet 
song in Jaurim’s 5th album, “All You Need Is Love”, released in 
October 2004.

What’s the meaning of 17171771? If we rotate it by 180 degrees, it 
looks like “ILLILILI”. If we add some blanks into it, it becomes “I 
LLILI LI”. Doesn’t it look like “I LUV U”? The meaning of 17171771 is 
“I LUV U”. Anyway, it has nothing to do with our problem.

What we are concerned more about is that, 17171771 is a prime 
consisting only of digits 1 and 7 occurring with equal frequency. In 
this problem, a prime consisting only of two different digits 
occurring with equal frequency is called nice number. For example, 89, 
71717117 and 23323333222223 are nice numbers.

Your task is to print all the nice numbers which are strictly less 
than 1018

Input

There is no input for this problem.

Output

Output all the nice number less than 1018 in increasing order. The 
output looks like the following:

13 17 19 … 17171771

AC代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define lowbit(x) (x&(-x))
typedef long long ll;
using namespace std;

vector <ll> vi;
set <ll> st;

void dfs(int *a,int len)
{
    do{
        ll tp = 0;
        if(a[0] == 0) continue;
        for(int i=0;i<len;i++)
            tp = tp * 10 + a[i];
        vi.push_back(tp);
    }while(next_permutation(a, a + len));
}

ll prime[6] = {2, 3, 5, 233, 331};
ll qmul(ll x, ll y, ll mod) // 乘法防止溢出, 如果p * p不爆ll的话可以直接乘; O(1)乘法或者转化成二进制加法
{
    return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll qpow(ll a, ll n, ll mod)
{
    ll ret = 1;
    while(n) {
        if(n & 1) ret = qmul(ret, a, mod);
        a = qmul(a, a, mod);
        n >>= 1;
    }
    return ret;
}
bool Miller_Rabin(ll p)
{
    if(p < 2) return 0;
    if(p != 2 && p % 2 == 0) return 0;
    ll s = p - 1;
    while(! (s & 1)) s >>= 1;
    for(int i = 0; i < 5; ++i)
    {
        if(p == prime[i]) return 1;
        ll t = s, m = qpow(prime[i], s, p);
        while(t != p - 1 && m != 1 && m != p - 1) {
            m = qmul(m, m, p);
            t <<= 1;
        }
        if(m != p - 1 && !(t & 1)) return 0;
    }
    return 1;
}

int main()
{
    int a[20] = {0};
    for(int i=0;i<=9;i++)
        for(int j=i+1;j<=9;j++)
            for(int k=1;k<=8;k++)
            {
                for(int l=0;l<k;l++)
                {
                    a[l] = i;
                    a[l+k] = j;
                }
                dfs(a, k*2);
            }
    for(int i=0;i<vi.size();i++)
        if(Miller_Rabin(vi[i]))
            st.insert(vi[i]);

    int cnt = 0;
    for(set<ll>::iterator it = st.begin(); it != st.end(); it++)
    {
        printf("%lld\n",(*it));
        cnt ++;
    }
    cout << cnt << endl;
}

 

 

以上是关于2017CCPC秦皇岛的主要内容,如果未能解决你的问题,请参考以下文章

2017CCPC秦皇岛G ZOJ 3987Numbers(大数+贪心)

2017CCPC秦皇岛 L题One-Dimensional Maze&&ZOJ3992模拟

[CCPC] 2017秦皇岛H Prime Set | 二分图最大匹配 [据说是个金牌题]

2017 CCPC秦皇岛 H.Prime Set(二分图匹配+分类讨论)

2017 CCPC秦皇岛 H.Prime Set(二分图匹配+分类讨论)

思维题2017 CCPC现场赛秦皇岛站 问题 M: Safest Buildings