2019ICPC徐州站题解

C题大水题,欧拉筛筛下素数,然后在线处理一下普通素数。

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define scan(i) scanf("%d",&i)
 4 #define scanl(i) scanf("%lld",&i)
 5 #define scand(i) scanf("%lf",&i)
 6 #define pf printf
 7 #define f(i,a,b) for(int i=a;i<=b;i++)
 8 const int N=1e7;
 9 int phi[N+10],prime[N+10],tot,ans;
10 bool mark[N+10];
11 void getphi()    {
12    int i,j;
13    phi[1]=1;
14    for(i=2;i<=N;i++){
15        if(!mark[i]){
16              prime[++tot]=i;//筛素数的时候首先会判断i是否是素数。
17              phi[i]=i-1;//当 i 是素数时 phi[i]=i-1
18              }
19        for(j=1;j<=tot;j++){
20           if(i*prime[j]>N)  break;
21           mark[i*prime[j]]=1;//确定i*prime[j]不是素数
22           if(i%prime[j]==0){//接着我们会看prime[j]是否是i的约数
23              phi[i*prime[j]]=phi[i]*prime[j];break;
24           }
25           else phi[i*prime[j]]=phi[i]*(prime[j]-1);//其实这里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性
26        }
27    }
28 }
29 //调用时,给出getphi();即可,mark[i]是false说明是素数,否则是合数
30
31 bool isPrime(int num)
32 {
33     if (num == 2 || num == 3)
34     {
35         return true;
36     }
37     if (num % 6 != 1 && num % 6 != 5)
38     {
39         return false;
40     }
41     for (int i = 5; i*i <= num; i += 6)
42     {
43         if (num % i == 0 || num % (i+2) == 0)
44         {
45             return false;
46         }
47     }
48     return true;
49 }
50
51 using namespace std;
52 int n,m,T;
53 int l,r;
54 int main()
55 {
56     getphi();
57     scan(T);
58     f(kk,1,T){
59         scanf("%d%d",&l,&r);
60         if(r<=1000){
61             int cnt=0;
62             f(i,l,r){
63                 if(mark[i]==false) cnt++;
64             }
65             if(cnt*3<r-l+1) pf("Yes\n");
66             else pf("No\n");
67         }
68         else if(r-l+1>=12){
69             pf("Yes\n");
70         }
71         else{
72             int cnt=0;
73             f(i,l,r){
74                 if(isPrime(i)) cnt++;
75             }
76             if(cnt*3<r-l+1) pf("Yes\n");
77             else pf("No\n");
78         }
79     }
80     return 0;
81 }

F题小水题,离线打表O(1)查询。要预处理一下立方数,会快一点。

  1 #include <bits/stdc++.h>
  2 #define ll long long
  3 #define scan(i) scanf("%d",&i)
  4 #define scanl(i) scanf("%lld",&i)
  5 #define scand(i) scanf("%lf",&i)
  6 #define pf printf
  7 #define f(i,a,b) for(int i=a;i<=b;i++)
  8 const double eps=1e-8;
  9 using namespace std;
 10 int ans[604]={
 11 0,0,0,
 12 0,0,1,
 13 0,1,1,
 14 1,1,1,
 15 -5001,0,0,
 16 -5001,0,0,
 17 -1,-1,2,
 18 0,-1,2,
 19 0,0,2,
 20 0,1,2,
 21 1,1,2,
 22 297,-641,619,
 23 7,-11,10,
 24 -5001,0,0,
 25 -5001,0,0,
 26 2,-1,2,
 27 0,2,2,
 28 1,2,2,
 29 75,-218,215,
 30 0,-2,3,
 31 1,-2,3,
 32 28,-86,85,
 33 -5001,0,0,
 34 -5001,0,0,
 35 2,2,2,
 36 1839,-2683,2357,
 37 0,-1,3,
 38 0,0,3,
 39 0,1,3,
 40 1,1,3,
 41 -5001,0,0,
 42 -5001,0,0,
 43 -5001,0,0,
 44 -5001,0,0,
 45 2,-1,3,
 46 0,2,3,
 47 1,2,3,
 48 0,-3,4,
 49 1,-3,4,
 50 -5001,0,0,
 51 -5001,0,0,
 52 -5001,0,0,
 53 -5001,0,0,
 54 2,2,3,
 55 -5,-7,8,
 56 2,-3,4,
 57 3,-2,3,
 58 6,-8,7,
 59 -2,-2,4,
 60 -5001,0,0,
 61 -5001,0,0,
 62 602,-796,659,
 63 -5001,0,0,
 64 3,-1,3,
 65 0,3,3,
 66 1,3,3,
 67 0,-2,4,
 68 1,-2,4,
 69 -5001,0,0,
 70 -5001,0,0,
 71 -1,-4,5,
 72 0,-4,5,
 73 2,3,3,
 74 0,-1,4,
 75 0,0,4,
 76 0,1,4,
 77 1,1,4,
 78 -5001,0,0,
 79 -5001,0,0,
 80 2,-4,5,
 81 11,-21,20,
 82 2,-1,4,
 83 0,2,4,
 84 1,2,4,
 85 -5001,0,0,
 86 -5001,0,0,
 87 -5001,0,0,
 88 -5001,0,0,
 89 26,-55,53,
 90 -19,-33,35,
 91 2,2,4,
 92 3,3,3,
 93 847,-1317,1188,
 94 3,-2,4,
 95 -5001,0,0,
 96 -5001,0,0,
 97 -5001,0,0,
 98 -1972,-4126,4271,
 99 3,-4,5,
100 6,-7,6,
101 3,-1,4,
102 0,3,4,
103 1,3,4,
104 -5,-5,7,
105 -5001,0,0,
106 -5001,0,0,
107 14,-22,20,
108 17,-22,18,
109 0,-3,5,
110 2,3,4,
111 -3,-6,7,
112 4,-3,4,
113 118,-239,229,
114 -5001,0,0,
115 -5001,0,0,
116 -4,-7,8,
117 2,-3,5,
118 947,-1309,1117,
119 -948,-1165,1345,
120 146,-1019,1018,
121 -5001,0,0,
122 148,-1040,1039,
123 -5001,0,0,
124 -5001,0,0,
125 -5001,0,0,
126 8,-12,11,
127 -1,-2,5,
128 0,-2,5,
129 3,3,4,
130 -2,-6,7,
131 4,-2,4,
132 -5001,0,0,
133 -5001,0,0,
134 -1,-1,5,
135 0,-1,5,
136 0,0,5,
137 0,1,5,
138 1,1,5,
139 0,4,4,
140 1,4,4,
141 -5001,0,0,
142 -5001,0,0,
143 2,-1,5,
144 0,2,5,
145 1,2,5,
146 2,-6,7,
147 2,4,4,
148 -9,-11,13,
149 -77,-86,103,
150 -5001,0,0,
151 -5001,0,0,
152 2,2,5,
153 -3,-7,8,
154 -5001,0,0,
155 3,-2,5,
156 -7,-8,10,
157 108,-149,127,
158 1528,-2366,2131,
159 -5001,0,0,
160 -5001,0,0,
161 260,-367,317,
162 3,-1,5,
163 0,3,5,
164 1,3,5,
165 3,-6,7,
166 3,4,4,
167 -5001,0,0,
168 -5001,0,0,
169 -5001,0,0,
170 80,-130,119,
171 2,3,5,
172 20,-31,28,
173 4,-3,5,
174 226,-1134,1131,
175 -45,-47,58,
176 -5001,0,0,
177 -5001,0,0,
178 -5001,0,0,
179 56,-172,170,
180 0,-7,8,
181 1,-7,8,
182 67,-87,71,
183 -5001,0,0,
184 -5001,0,0,
185 7,-8,7,
186 -5001,0,0,
187 -5001,0,0,
188 2,-7,8,
189 -10,-13,15,
190 3,3,5,
191 -5001,0,0,
192 4,-2,5,
193 9,-14,13,
194 10,-17,16,
195 -5001,0,0,
196 -5001,0,0,
197 5,-4,5,
198 27,-58,56,
199 4,-1,5,
200 0,4,5,
201 1,4,5,
202 4,-6,7,
203 4,4,4,
204 -5001,0,0,
205 -5001,0,0,
206 -5001,0,0,
207 3,-7,8,
208 2,4,5,
209 148,-195,161,
210 15,-24,22,
211 73,-114,103};
212 int l,r;
213 struct p{
214     int a;int b;int c;
215     p(){}
216     p(int aa,int bb,int cc){
217         a=aa;
218         b=bb;
219         c=cc;
220     }
221 }vec[202];
222 int main()
223 {
224     /*freopen("in.txt","r",stdin);
225     f(i,0,200){
226         stringstream ss;
227         string s;
228         getline(cin,s);
229         if(s.length()<=2){
230             cout<<"-5001,0,0,"<<endl;
231             continue;
232         }
233         //scanf("%d",&vec[i].a);
234         ss.str(s);
235         ss>>vec[i].a;
236             //scanf("%d%d",&vec[i].b,&vec[i].c);
237             ss>>vec[i].b>>vec[i].c;
238             cout<<vec[i].a<<","<<vec[i].b<<","<<vec[i].c<<",\n";
239     }*/
240     int T,n;
241     scan(T);
242     f(kk,1,T){
243         scan(n);
244         if(ans[3*n]==-5001){puts("impossible");}
245         else pf("%d %d %d\n",ans[3*n],ans[3*n+1],ans[3*n+2]);
246     }
247 }

A题数论题。已将结论整理在ACM-数论:一些零碎的数论定理中。

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define scan(i) scanf("%d",&i)
 4 #define scanl(i) scanf("%lld",&i)
 5 #define scand(i) scanf("%lf",&i)
 6 #define pf printf
 7 #define f(i,a,b) for(int i=a;i<=b;i++)
 8 using namespace std;
 9 int T;
10 ll l,r,s;
11 ll cal(ll x){
12     switch(x%4){
13         case 0:return x;
14         case 1:return 1;
15         case 2:return x+1;
16         case 3:return 0;
17     }
18 }
19 int main()
20 {
21     scan(T);
22     f(kk,1,T){
23         scanf("%lld%lld%lld",&l,&r,&s);
24         ll lef=(l+1)/2*2;
25         ll m=(lef+3)%4ll;
26         ll rig=(r-m)/4*4+m;
27         //cout<<lef<<" "<<rig<<endl;
28         if(rig>lef){
29             ll ans=0;
30             ll ansv=rig-lef+1;
31             //ll zuo=lef-l;
32             //ll you=r-rig;
33             for(ll i=lef;i>=l;i--){
34                 ll ans1=ans;
35                 for(ll j=rig;j<=r;j++){
36                     //if(i==lef&&j==rig) continue;
37                     if(j!=rig) ans1^=j;
38                     if(ans1<=s){
39                         ansv=max(ansv,j-i+1);
40                     }
41                 }
42                 ans^=(i-1);
43             }
44             //cout<<ansv<<endl;
45             pf("%lld\n",ansv);
46         }
47         else{
48             ll ans=-1;
49             //cout<<s<<endl;
50             for(ll i=l;i<=r;i++){
51                 for(ll j=i;j<=r;j++){
52                     if((cal(i-1)^cal(j))<=s){
53                         ans=max(ans,j-i+1);
54                         //cout<<i-1<<" "<<j<<" "<<(cal(i-1)^cal(j))<<" "<<s<<endl;
55                     }
56                 }
57             }
58             //cout<<ans<<endl;
59             pf("%lld\n",ans);
60         }
61     }
62     return 0;
63 }

M题关于树。我一定要学会数据结构中的树,只靠那一点自欺欺人的数论和图论知识是没有办法独当一面的。只有自己才最靠得住。加油啊。

原文地址:https://www.cnblogs.com/St-Lovaer/p/12002279.html

时间: 2024-08-30 18:36:10

2019ICPC徐州站题解的相关文章

2019ICPC徐州站M题

前天在复现赛开M自闭两天,全网找不到题解,后来偶遇cometoj群中的Acmer帮我解决困惑,在此匿名感谢qq名称为不好好学习不改名同学,以下思路均由他提供,也希望为后来人提供一定的思路和想法 题解: 首先很容易看出这是道求树的重心的问题,但是由于他要求所有子树的重心,所以暴力求解会超时,因此我们需要进行剪枝,剪枝需要几点性质 1.两个树合并之后树的重心在之前两棵树重心的连线路径上. 2.如果子树的节点数大于父树节点树的一半,那么父树重心可以由该子树转移而来,因为重心的意义就是代表除去该点后最大

2019ICPC南京站题解

A题大水题. 1 #include <bits/stdc++.h> 2 #define ll long long 3 #define f(i,a,b) for(int i=a;i<=b;i++) 4 #define scan(i) scanf("%d",&i) 5 #define pf printf 6 using namespace std; 7 8 int main() 9 { 10 int n; 11 scan(n); 12 f(i,1,n){ 13 i

2019ICPC银川站 后记

考量到银川赛区的综合因素,赛前给队友立下flag 所以说啊 我们前四场都喊着保银争金,结果差一点金了,这场喊着保金冲出线,结果差一点出线了(雾) 事实上从正式赛来看,本场也确实是我队建队以来发挥的最好,合作的最默契的现场赛了,自从上场哈尔滨去世导致我队被银牌四杀之后,我们就一直试图从队内配合,队内交流,现场赛环境差异来寻找问题,在总结了很多次之后,本场比赛,至少我们没有犯下肉眼可见的大错误--除了A题最后题意交流出错,但我们当时似乎也没有想到A题的正解 Day0: 队友叫我一起下棋,下了几把发现

2019icpc银川站 复现赛

打了计蒜客上的银川重现赛,总体感觉难度上确实比平时区域赛要低上一些. 这里补一下F题和G题的思路和代码. F题        做法,玩一下n=10的样例就出来啦! 解释:显然a^x的反函数为logax,我们先固定外层的求和的a,然后看内层求和的b,b从a开始加到n,注意到对于后半个向上取整的logba,b>=a,所以始终都是1,而对于前半个式子,只有当b经过a^i时才增加,举个例子就是log22~log23向下取整都为1,log24~log27向下取整都为2,log28~log210都为3. 对

20180909徐州网络赛题解

目录 20180909徐州网络赛题解 A. Hard to prepare MEANING SOLUTION CODE B. BE, GE or NE MEANING SOLUTION CODE F. Features Track CODE G. Trace MENING SOLUTION CODE H. Ryuji doesn't want to study MEANING CODE I. Characters with Hash CODE J. Maze Designer MEANING S

【hdu 5521】【 2015ACM/ICPC亚洲区沈阳站重现赛】Meeting 题意&题解&代码

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5521 题意: 输入:输入n表示有n个点,输入m表示有m个点集. 接下来m行信息,每行先输入一个t表示这个点集中任意两点费时为t,再输入一个s,表示有s个点在这个点集中,接下来s个数表示这些数在这个点集之中. 现在有两个人,其中一个人住在点1,另一个人住在点n,如果两个人要见面,同时出发,可以走走停停,问需要最少时间是多少,有哪几个点能被当成见面点. 题解: 我们发现这道题如果建好图之后就直接是一个

【hdu 5517】【2015ACM/ICPC亚洲区沈阳站】Triple 题意&题解&代码(C++)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5517 题意: 给出n个二元组<a,b>和m个三元组<c,d,e>现在将其组合成一个新的三元组集合,新三元组中允许有重复元素,一个二元组和一个三元组可以组合当且仅当b==e时将其组合成<a,c,d>,在新组合的三元组中任取一元素<a,b,c>,如果在新组合存在一个元素<u,v,w>使得u!=a && v!=b && w

【hdu 5512】【 2015ACM/ICPC亚洲区沈阳站】Pagodas 题意&题解&代码(C++)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5512 题意: 给出n个点和a,b两个初始被标记的点,每次可以选取已经被标记点中的两个点 i , j 来标记新点 i+j 或 i-j,两个人轮流标记,如果谁无法标记,谁输,输出赢的人. 题解: 首先我们发现当a,b互质时,它通过以上操作,一定能标记到1号点,接着所有点都可以标记,当a,b不互质时,多写几个数找规律发现gcd(a,b)倍数的位置都可以标记到. 代码: #include<iostream

【hdu 5510】【2015ACM/ICPC亚洲区沈阳站-重现赛 】Bazinga 题意&题解&代码(C++)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5510 题意: 给出n个字符串,求下标最大的字符串,存在下标小于它的字符串中有字符串不是他的子串. 题解: 首先能想到kmp+n^2暴力匹配,但是感觉会超时,因此我们需要加一些剪枝,水题,不要被他的数据范围吓到.. 代码: #include<iostream> #include<algorithm> #include<stdio.h> #include<string.