您的位置:首页 > 其它

中国(北方)大学生程序设计训练赛(第二周) (A B D G)

2017-03-12 16:57 246 查看
比赛链接

A题是KMP,先把A拼接到B的后面,然后利用next数组的意义(包括其具体含义,以及失配时的应用),得到ans

1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long LL;
4
5 const int N=1e6+3;
6 int not_prime[N+5];
7 vector<int> prime;
8 bool vis[N+5];        //图中存在label,使i是label的质因数
9 bool done[N+5];        //这一连通分量是否已被计数
10 int p[N+5];
11 int T,kase;
12
13 int Find(int x)
14 {
15     return x==p[x]? x:p[x]=Find(p[x]);
16 }
17 void Union(int x,int y)
18 {
19     x=Find(x),y=Find(y);
20     p[x]=y;
21 }
22
23 void init()
24 {
25     for(int i=2;i<=N;i++)
26     {
27         if(!not_prime[i])
28         {
29             //printf("%d=====\n",i);
30             prime.push_back(i);
31             for(LL j=(LL)i*i;j<=N;j+=i)
32                 not_prime[j]=true;
33         }
34     }
35 }
36 int init1()
37 {
38     for(int i=1;i<=N;i++)
39         p[i]=i;
40     memset(vis,false,sizeof(vis));
41     memset(done,false,sizeof(done));
42 }
43
44 void getFactors(int x)
45 {
46     vector<int> a;
47     for(int i=0;prime[i]*prime[i]<=x;i++)
48     {
49         if(x%prime[i]==0)
50         {
51             a.push_back(prime[i]),vis[prime[i]]=true;
52             while(x%prime[i]==0) x/=prime[i];
53         }
54     }
55     if(x>1) a.push_back(x),vis[x]=true;
56     for(int i=1;i<a.size();i++)
57         Union(a[0],a[i]);
58 }
59
60 int solve()
61 {
62     int ret=0;
63     for(int i=0;i<prime.size();i++)
64     {
65         if(vis[prime[i]])
66         {
67             int t=Find(prime[i]);
68             if(!done[t])
69             {
70                 ret++;
71                 //printf("===%d====",t);
72                 done[t]=true;
73             }
74         }
75     }
76     return ret;
77 }
78
79 int main()
80 {
81     init();
82     //freopen("test.txt","r",stdin);
83     scanf("%d",&T);
84     while(T--)
85     {
86         init1();
87         int ans=0;
88         int n;
89         scanf("%d",&n);
90         for(int i=0;i<n;i++)
91         {
92             int t;
93             scanf("%d",&t);
94             if(t==1)
95             {
96                 ans++;
97                 continue;
98             }
99             getFactors(t);
100         }
101         ans+=solve();
102         printf("Case %d: %d\n",++kase,ans);
103     }
104 }


G
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐