1. 程式人生 > >2018 ACM-ICPC 中國大學生程式設計競賽線上賽

2018 ACM-ICPC 中國大學生程式設計競賽線上賽

B Goldbach

B題的大意是,有T組測試資料,給一個偶數然後輸出它分解的兩個素數之和,可以是任意兩個滿足的素數。

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <algorithm>  
#include <iostream>  
#include <math.h>  

using namespace std;
const int Times = 10;
typedef unsigned long long LL;
// a * b % n  
//例如: b = 1011101那麼 //a * b mod n = (a * 1000000 mod n + a * 10000 mod n + a * 1000 mod n + a * 100 mod n + a * 1 mod n) mod n LL multi(LL a, LL b, LL m) // 計算 a*b % m { LL ans = 0; a %= m; while (b) { if (b & 1) { ans = (ans + a) % m; b--; } b >>= 1
; a = (a + a) % m; } return ans; } LL quick_mod(LL a, LL b, LL m) // 計算 a^b % m { LL ans = 1; a %= m; while (b) { if (b & 1) { ans = multi(ans, a, m); b--; } b >>= 1; a = multi(a, a, m); } return
ans; } bool Miller_Rabin(LL n) { if (n == 2) return true; if (n < 2 || !(n & 1)) return false; LL m = n - 1; int k = 0; while ((m & 1) == 0) { k++; m >>= 1; } for (int i = 0; i<Times; i++) { LL a = rand() % (n - 1) + 1; LL x = quick_mod(a, m, n); //大整數的快速冪演算法( (a*a)% n),直接a*a傳送資料溢位=>(a%n * a%n)%n LL y = 0; for (int j = 0; j<k; j++) { y = multi(x, x, n); if (y == 1 && x != 1 && x != n - 1) return false; x = y; } if (y != 1) return false; } return true; } int main() { int T; long long i; scanf_s("%d", &T); while (T--) { LL n; scanf_s("%llu", &n); for (i = 3; i < n; i=i+2) //如果i從2開始每次加1的話,會超時 if (Miller_Rabin(i) && Miller_Rabin(n - i)) { printf("%lld %lld\n", i, n - i); break; } } return 0; }

I Reversion Count

題目大意是:有一個正整數X,X的返回計數為Y.例如,X = 123,Y = 321; X = 1234,Y = 4321。 Z =(XY)/ 9,如果Z僅由一個數字(0,1,2 … 9)組成,如Z = 11,Z = 111,Z = 222,(不考慮’+’和’ - ‘)則輸出“YES”,否則輸出“NO”

//直接套用大數減法,大數除法模板
#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
#define MAX 1000    
int Subtraction(char num1[], char num2[], int sum[])
{
    int i, j, len, blag;
    char *temp;
    int n2[MAX] = { 0 };
    int len1 = strlen(num1); // 計算陣列num1的長度,即大數的位數 
    int len2 = strlen(num2); // 計算陣列num2的長度,即大數的位數

                             // 在進行減法之前要進行一些預處理 
    blag = 0; // 為0表示結果是正整數,為1表示結果是負整數 
    if (len1 < len2) // 如果被減數位數小於減數
    {
        blag = 1; // 標記結果為負數
                  // 交換兩個數,便於計算 
        temp = num1;
        num1 = num2;
        num2 = temp;
        len = len1;
        len1 = len2;
        len2 = len;
    }
    else if (len1 == len2) // 如果被減數的位數等於減數的位數
    {
        // 判斷哪個數大 
        for (i = 0; i < len1; i++)
        {
            if (num1[i] == num2[i])
                continue;
            if (num1[i] > num2[i])
            {
                blag = 0; // 標記結果為正數 
                break;
            }
            else
            {
                blag = 1; // 標記結果為負數 
                          // 交換兩個數,便於計算 
                temp = num1;
                num1 = num2;
                num2 = temp;
                break;
            }
        }
    }
    len = len1>len2 ? len1 : len2; // 獲取較大的位數
                                   //將num1字元陣列的數字轉換為整型數且逆向儲存在整型陣列sum中,即低位在前,高位在後
    for (i = len1 - 1, j = 0; i >= 0; i--, j++)
        sum[j] = num1[i] - '0';
    // 轉換第二個數 
    for (i = len2 - 1, j = 0; i >= 0; i--, j++)
        n2[j] = num2[i] - '0';
    // 將兩個大數相減 
    for (i = 0; i <= len; i++)
    {
        sum[i] = sum[i] - n2[i]; // 兩個數從低位開始相減 
        if (sum[i] < 0)   // 判斷是否有借位 
        {    // 借位 
            sum[i] += 10;
            sum[i + 1]--;
        }
    }
    // 計算結果長度 
    for (i = len1 - 1; i >= 0 && sum[i] == 0; i--)
        ;
    len = i + 1;
    if (blag == 1)
    {
        sum[len] = -1;  // 在高位新增一個-1表示負數 
        len++;
    }
    return len;   // 返回結果的位數 
}

int SubStract(int *p1, int len1, int *p2, int len2)
{
    int i;
    if (len1 < len2)
        return -1;
    if (len1 == len2)
    {                        // 判斷p1 > p2
        for (i = len1 - 1; i >= 0; i--)
        {
            if (p1[i] > p2[i])   // 若大,則滿足條件,可做減法
                break;
            else if (p1[i] < p2[i]) // 否則返回-1
                return -1;
        }
    }
    for (i = 0; i <= len1 - 1; i++)  // 從低位開始做減法
    {
        p1[i] -= p2[i];         // 相減 
        if (p1[i] < 0)           // 若是否需要借位
        {   // 借位 
            p1[i] += 10;
            p1[i + 1]--;
        }
    }
    for (i = len1 - 1; i >= 0; i--)  // 查詢結果的最高位
    {
        if (p1[i])             //最高位第一個不為0
            return (i + 1);       //得到位數並返回
    }
    return 0;                   //兩數相等的時候返回0
}

int Division(char num1[], char num2[], char sum[])
{
    int k, i, j;
    int len1, len2, len = 0;     //大數位數
    int dValue;                //兩大數相差位數
    int nTemp;                 //Subtract函式返回值
    int num_a[MAX] = { 0 };      //被除數
    int num_b[MAX] = { 0 };      //除數
    int num_c[MAX] = { 0 };      //商 

    len1 = strlen(num1);       //獲得大數的位數
    len2 = strlen(num2);

    //將數字字元轉換成整型數,且翻轉儲存在整型陣列中 
    for (j = 0, i = len1 - 1; i >= 0; j++, i--)
        num_a[j] = num1[i] - '0';
    for (j = 0, i = len2 - 1; i >= 0; j++, i--)
        num_b[j] = num2[i] - '0';

    if (len1 < len2)          //如果被除數小於除數,直接返回-1,表示結果為0
    {
        return -1;
    }
    dValue = len1 - len2;      //相差位數
    for (i = len1 - 1; i >= 0; i--)    //將除數擴大,使得除數和被除數位數相等
    {
        if (i >= dValue)
            num_b[i] = num_b[i - dValue];
        else                         //低位置0
            num_b[i] = 0;
    }
    len2 = len1;
    for (j = 0; j <= dValue; j++)    //重複呼叫,同時記錄減成功的次數,即為商
    {
        while ((nTemp = SubStract(num_a, len1, num_b + j, len2 - j)) >= 0)
        {
            len1 = nTemp;            //結果長度
            num_c[dValue - j]++;       //每成功減一次,將商的相應位加1
        }
    }
    // 計算商的位數,並將商放在sum字元陣列中 
    for (i = MAX - 1; num_c[i] == 0 && i >= 0; i--);  //跳過高位0,獲取商的位數 
    if (i >= 0)
        len = i + 1; // 儲存位數 
    for (j = 0; i >= 0; i--, j++)     // 將結果複製到sum陣列中 
        sum[j] = num_c[i] + '0';
    sum[j] = '\0';   // sum字元陣列結尾置0 
    return len;      // 返回商的位數 
}

int main()
{
    int i, len;
    int sum[MAX] = { 0 }; // 存放計算的結果,低位在前,高位在後,即sum[0]是低位 
    char num1[100];
    char num2[100];
    while (cin >> num1) {
        strcpy_s(num2, num1);
        int x = strlen(num1);
        for (int i = 0; i < x; i++)
            num2[i] = num1[x - i-1];
        //_strrev(num2);
        len = Subtraction(num1, num2, sum);    // 兩數相減 

        if (sum[i = len - 1] < 0) // 根據高位是否是-1判斷是否是負數
        { 
            i--;
        }
        if (sum[i] <= 0) {   //相減結果為0直接輸出
            cout << "YES" << endl;
            continue;
        }
        for (int j = 0; i >= 0; i--, j++) {

            num1[j] = sum[i] + '0';
        }

        char sum2[MAX] = { 0 };
        char num3[100] = { '9' };
        len = Division(num1, num3, sum2);
        int flag = 0;
        for (int i = 0; i < len - 1 && len>2; i++) {
            if ((sum2[i] - '0') != (sum2[i + 1] - '0'))
            {
                cout << "NO" << endl;
                flag = 1;
                break;
            }
        }
        if (flag) continue;
        cout << "YES" << endl;
    }
    return 0;
}

L. Nise-Anti-AK Problem

//題目大意是求那個數的f(x)最大,發現直接排序找最大數即可
#include <iostream>
#include <algorithm>
using namespace std;
int n,T;
int a[1001];
int main(){
    cin>>T;
    while(T--){
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);
        cout<<a[n-1]<<endl;
    }
    return 0;
}

相關推薦

【補充上一篇】網路流問題——最大帶權閉合路徑 2018 ACM-ICPC 中國大學生程式設計競賽線上 F. Clever King

今天把吉林大學的模板也試了一下,它使用的是所謂的Dinic演算法,比普通的BFS不知道快(高)到哪裡去了 程式碼: #include<iostream> #include<algorithm> #include<cstring> using na

2018 ACM-ICPC 中國大學生程式設計競賽線上

B Goldbach B題的大意是,有T組測試資料,給一個偶數然後輸出它分解的兩個素數之和,可以是任意兩個滿足的素數。 #include <stdio.h> #include <stdlib.h> #include <

2018 ACM-ICPC 中國大學生程式設計競賽線上 H-Rock Paper Scissors Lizard Spock.

分析:石頭剪刀布加強版。把短的字串跟長的字串從某一位置進行匹配,問最多可以匹配多少位。把其中一個串反轉,對每一種字元單獨計算。字元匹配的過程看做卷積和,則當前要匹配的字元對應1,否則為0。用FFT快速求解,最後取最大值。程式碼如下:#include <cstdio>

2018 ACM-ICPC 中國大學生程序設計競賽線上 B. Goldbach-米勒拉賓素數判定(大素數)

中國大學 sig anti lan icp cnblogs div con esp 若幹年之前的一道題,當時能寫出來還是超級開心的,雖然是個板子題。一直忘記寫博客,備忘一下。 米勒拉判大素數,關於米勒拉賓是個什麽東西,傳送門了解一下:biubiubiu~ B. Gold

ACM-ICPC國際大學生程式設計競賽北京賽區(2017)網路(A+E+F+G+I)

目錄 A - Visiting Peking University(模擬) E - Territorial Dispute(數學幾何+思維) F - Cake(思維) G - Bounce(找規律) I - Minimum(線段樹模板題) A - Visiting

HDU 2018中國大學生程式設計競賽---網路

Find Integer----費馬大定理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot

ACM-ICPC國際大學生程式設計競賽北京賽區(2017)網路 題解彙總 Territorial Dispute

#include <iostream> #include<algorithm> #include<cstdio> #include <cstring> #include <cmath> using

ACM-ICPC國際大學生程式設計競賽北京賽區(2017)網路 Bounce

題目7 : Bounce 時間限制:1000ms 單點時限:1000ms 記憶體限制:256MB 描述 For Argo, it is very interesting watching a circle bouncing in a rectangle. A

ACM-ICPC國際大學生程式設計競賽北京賽區(2015)網路

補題。 列舉圓心點,然後二分半徑。注意圓的邊上不能有點。 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<algorithm> #include<iostream&g

#數論、離散化、樹狀陣列# 2018中國大學生程式設計競賽 - 網路選拔賽

題目連結   1001. Buy and Resell Problem Description The Power Cube is used as a stash of Exotic Power. There are n cities nu

"位元組跳動杯"2018中國大學生程式設計競賽-女生專場(ing)

1002. 口算訓練 題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6287 Problem Description 小Q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小T,給了小T一個長度為n的正整數序列a1,a2,...,an,

缺失的資料範圍 2018中國大學生程式設計競賽-女生專場

不難發現隨著 n 的增大,na (⌈log2 n⌉)b 的值不會減小,反之亦然。二分查詢最大的滿足 na (⌈log2 n⌉)b 不超過 k 的 n 即可。 有兩點需要注意:• 乘法可能溢位 64 位整數,需要特殊處理。 • 求 ⌈log2 n⌉ 時不應使用實數計算,這將帶來

CCPC2018中國大學生程式設計競賽 - 網路選拔賽

  HDU 6438 1001 Buy and Resell Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota

"巴卡斯杯" 中國大學生程式設計競賽 - 女生專場 E - GirlCat

As a cute girl, Kotori likes playing ``Hide and Seek'' with cats particularly.  Under the influence of Kotori, many girls and cats are play

"巴卡斯杯" 中國大學生程式設計競賽 - 女生專場 C - Luck Competition

Participants of the Luck Competition choose a non-negative integer no more than 100 in their mind. After choosing their number, let KK 

"巴卡斯杯" 中國大學生程式設計競賽 - 女生專場 B - Desert

A tourist gets lost in the desert with n liters of water. He drinks positive integer units of water each day.  Write a program to calculate

"巴卡斯杯" 中國大學生程式設計競賽 - 女生專場 A - Solving Order

Welcome to HDU to take part in the first CCPC girls' competition!  As a pretty special competition, many volunteers are preparing f

國慶七天樂day1_2016中國大學生程式設計競賽(長春)hdu5918_Sequence I(kmp)

傳送門 題意:問a從存在多少子序列滿足子序列在a中的下標間隔為p且該子序列就是b. 直接把個子序列拿出來,依次kmp求和即可,每次詢問複雜度為 #pragma GCC optimi

“浪潮杯”第九屆山東省ACM大學生程式設計競賽重現 題解

點選轉到(牛客網) 1.思路:       給定兩個字串,假設是ELLY與KRIS,E到K是6,L到R是6,當第二個L到I時,L是比I大的,此時L就要繞到Z,從Z到A,再從A開始到I,這樣長度就是23,Y到S同理,長度是20;這樣找完之後序列長度之和就是6 +6+23

2018ACM-ICPC國際大學生程式設計競賽亞洲區域(青島站)賽後總結

這是今年最後一次打鐵,我已經打了一年的鐵了。 還是想寫一個總結,不然,什麼都會沒留下。 實際上在去青島之前,我已經一個月都沒有嚴格地訓練自己了,從9月份CCPC秦皇島站打鐵之後,我就基本上開始懷疑自己了,熱情也沒有第一次打區域賽那麼高了,加上回來以後,學校ACM集訓