2018 ACM-ICPC 中国大学生程序设计竞赛暨丝绸之路程序设计竞赛

 

三道大水题,其它题都不会做,真是尴尬和无奈啊…… 

有想法,但是解决不了,感觉个人不会一些基本解法,终究还是个人学习的内容太少了

 

B. Goldbach

/*
数值较小,<2^63,分解的两个素数较小,其中一个小于xxx(etc. 1e5)
生成1~x的素数:O(n) 
判断素数不能只用已求出的素数相除,这样结果不对。而且这个方法速度太慢。

Code largely studys from https://paste.ubuntu.com/p/JmDk43TTPB/

米勒拉宾素数测试
https://www.cnblogs.com/cons/p/5188910.html

用unsigned long long 不明觉厉…… 
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll unsigned long long
const long maxn=1e6;
//const ll mod=1e9+7;

bool vis[maxn];
long sum=0;
ll zhi[maxn];

//由于考虑到取模数很大 快速幂会溢出
ll add_mod(ll a,ll b,ll mod) //a*b = a*x1 + a*x2 + …
{
    ll ans=0;
    while (b)
    {
        if (b & 1)
            ans=(ans+a)%mod;
        a=(a<<1)%mod;
        b>>=1;
    }
    return ans;
}

ll pow_mod(ll a,ll b,ll mod) //a^b =a^(b/2)*a^(b/2) *a(if b%2==1)
{
    if (b>1)
    {
        ll tmp=pow_mod(a,b>>1,mod);
        tmp=add_mod(tmp,tmp,mod);
        if (b & 1)
            tmp=add_mod(tmp,a,mod);
        return tmp;
    }
    return a;
    
//    ll r=1;
//    while (b)
//    {
//        if (b & 1)
//            r=r*a%mod;
//        a=a*a%mod;
//        b>>=1;
//    }
//    return r;
}

bool Miller_Rabbin(ll s,ll chu)
{
    long ci=0,i;
    ll d=s-1;    //ll
    while (!(d & 1))    //除成奇数 
    {
        d>>=1;
        ci++;
    }
    ll k=pow_mod(chu,d,s);
    if (k==1)    //第一个为奇数 
        return 1;
    for (i=0;i<ci;i++,k=k*k%s)
        if (k==s-1)    //以后的为偶数 
            return 1;
    return 0;
}

bool pan(ll s)
{
    long i,g=5;
    ll chu[]={2,3,5,7,11};
    for (i=0;i<g;i++)
        if (s==chu[i])
            return 1;
    for (i=0;i<g;i++)
        if (s%chu[i]==0)
            return 0;
    for (i=0;i<g;i++)
        if (!Miller_Rabbin(s,chu[i]))
            return 0;
    return 1;
    
//    if (s<maxn)
//        return vis[s];
//    else
//    {
//        long i;
//        for (i=1;i<=ans;i++)
//            if (s%zhi[i]==0)
//                return false;
//        return true;
//    }
}

int main()
{
    long i,j,t;
    ll n;
    for (i=1;i<maxn;i++)
        vis[i]=true;
    for (i=2;i<maxn;i++)
    {
        if (vis[i])
        {
            sum++;
            zhi[sum]=i;
        }
        for (j=1;j<=sum;j++)
        {
            if (i*zhi[j]>=maxn)
                break;
            vis[i*zhi[j]]=false;
            if (i%zhi[j]==0)
                break;
        }
    }
    
    scanf("%ld",&t);
    while (t--)
    {
        scanf("%llu",&n);
        for (i=1;i<=sum;i++)
            if (pan(n-zhi[i]))
            {
                printf("%llu %llu\n",zhi[i],n-zhi[i]);
                break;
            }
    }
    return 0;
}
/*
126
146
22222222222
*/

 

 

E. Copy and Submit II

运行题目程序一遍就知道了

内存超限(没删原程序的a数组) -> 编译错误(只删了原程序的a数组,没删其它a变量) -> 运行超时(按照题目的代码用cin) -> 运行超时(scanf没用EOF) -> 正确通过

满满的泪水………………………………………………………………………………………………………………………………………………………………………

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
const long maxn=1e6+5;
const ll mod=1e9+7;

int main()
{
    int n,i;
    long long r,a;
    while (scanf("%ld",&n)!=EOF)
    {
        r=1;
        for (i=0;i<n;i++)
        {
            scanf("%lld",&a);
            r=r*(a+1)%mod;
        }
        printf("%lld\n",r);
    }
    return 0;
}

 

I. Reversion Count

 1 //找个样例从头到尾调试一次,查看变量 
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <list>
 7 #include <stack>
 8 #include <vector>
 9 #include <set>
10 #include <map>
11 #include <queue>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 #define ll long long
16 const long maxn=1e6+5;
17 const ll mod=1e9+7;
18 
19 long a[105],b[105],n;
20 
21 bool pan()
22 {
23     long i;
24     //从高位到低位,之前写错了 ,其实无关紧要,结果能被9整除 
25     for (i=n;i>=1;i--)
26         if (a[i]>b[i])
27             return true;
28         else if (a[i]<b[i])
29             return false;
30     return false;
31 }
32 
33 int main()
34 {
35     long i,t,x;
36     char s[105];
37 //    while (scanf("%s",s)!=EOF)
38     while (cin>>s)
39     {
40         n=strlen(s);
41         for (i=1;i<=n;i++)
42             a[i]=s[n-i]-48;
43         for (i=1;i<=n;i++)
44             b[i]=a[n+1-i];
45         if (!pan())
46         {
47             for (i=1;i<=n;i++)
48             {
49                 t=a[i];
50                 a[i]=b[i];
51                 b[i]=t;
52             }
53         }
54         for (i=1;i<=n;i++)
55         {
56             a[i]-=b[i];
57             if (a[i]<0)
58             {
59                 a[i+1]--;
60                 a[i]+=10;
61             }
62         }
63         x=0;
64         for (i=n;i>=1;i--)
65         {
66             x=x*10+a[i];
67             a[i]=x/9;
68             x=x%9;
69         }
70         while (n>1 && a[n]==0)
71             n--;
72         //只使用一位数字,之前写错了
73         while (n>1 && a[n]==a[n-1])
74             n--;
75         if (n==1)
76             printf("YES\n");
77         else
78             printf("NO\n");
79     }
80     return 0;
81 }

 

L. Nise-Anti-AK Problem

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <list>
 6 #include <stack>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <queue>
11 #include <algorithm>
12 #include <iostream>
13 using namespace std;
14 #define ll long long
15 const long maxn=1e6+5;
16 const ll mod=1e9+7;
17 
18 long a[1005];
19 
20 int main()
21 {
22     long t,n,i;
23 //    for (i=1;i<=100;i++)
24 //    {
25 //        long sum=0;
26 //        for (int j=0;j<=i;j++)
27 //            sum+= (i | j);
28 //        printf("%ld\n",sum);
29 //    }
30     
31     scanf("%ld",&t);
32     while (t--)
33     {
34         scanf("%ld",&n);
35         for (i=1;i<=n;i++)
36             scanf("%ld",&a[i]);
37         sort(a+1,a+n+1);
38         printf("%ld\n",a[n]);
39     }
40     return 0;
41 }

 

posted @ 2018-04-22 17:30  congmingyige  阅读(1407)  评论(0编辑  收藏  举报