A题
子序列和啊,就要想到前缀和的差。这个转换一定要!记着!那么i到j的一段子序列和Sij%m == 0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一样的,那么是不是就存在着一段子序列满足条件了,然后注意一下边边角角应该就没问题了。
因为ZOJ坏掉了,所以我尚未验证以下答案的ans是否就是满足条件的序列总数!移步ZOJ1569自行验证。
1 #include <cstdio> 2 #include <set> 3 #include <map> 4 #include <queue> 5 #include <cmath> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 typedef long long LL; 10 const int INF = 0x3f3f3f3f; 11 12 int num[5000 + 50]; 13 int main() 14 { 15 int t; 16 scanf("%d",&t); 17 while(t--) 18 { 19 int n,m,x,ans = 0,sum = 0; 20 memset(num,0,sizeof(num)); 21 scanf("%d%d",&n,&m); 22 for(int i = 0 ; i < n; i++) 23 { 24 scanf("%d",&x); 25 sum = (sum + x) % m; 26 if(sum == 0) ans++; 27 num[ sum ]++; 28 } 29 30 for(int i = 0; i< m; i++) 31 { 32 ans += (num[i] - 1) * num[i] / 2; 33 } 34 if(ans != 0) 35 printf("YES\n"); 36 else 37 printf("NO\n"); 38 } 39 40 return 0; 41 }
B题(思路)
这个应该算是个贪心。真尼玛= =,脑洞题。
我也不知道怎么讲比较好,自己拿个笔和纸琢磨一下,应该就搞懂了,网上那些题解说的感觉也不好。还是要拿笔,照这个程序,手动模拟一下,应该就能搞懂了。
1 #include <cstdio> 2 #include <set> 3 #include <map> 4 #include <queue> 5 #include <cmath> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 typedef long long LL; 10 typedef long long LL; 11 const int INF = 0x3f3f3f3f; 12 const int maxn = 100050; 13 int a[maxn]; 14 int main() 15 { 16 int t,n,m; 17 scanf("%d", &t); 18 while(t--) 19 { 20 scanf("%d%d", &n, &m); 21 for(int i = 0; i < n - 1; i++) 22 scanf("%d", &a[i]); 23 sort(a, a + n - 1); 24 LL ans = n; 25 for(int i = 0; i< n - m; i++) 26 ans += a[i]; 27 printf("%I64d\n", ans); 28 } 29 return 0; 30 }
C题
这题竟然是交一暴力就能A了。。我也是醉了啊。
学个小姿势:素数定理:
也就是说1到n以内的素数个数大概是O(sqrt(x) * ln x)个
那么就可以看出这道题,枚举暴力的时间复杂度,其实就是对n=sqrt(x),的前后的一些素数进行枚举嘛,所以最多和1到sqrt(x)范围内的素数个数差不多?所以暴力的时间复杂度O(n4logn2\sqrt[4]{n}log\sqrt[2]{n},所以能直接枚举。
素数,总是要注意一些比2小的数的情况。这道题里面还有什么,是不是正数啊,有没有加LL啊,巴拉巴拉啦。打高亮了。
1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 const LL INF = 0x3f3f3f3f3f3f3f3fll; 8 LL x,z,ans; 9 bool judge(LL t) 10 { 11 if(t < 2) return false; 12 LL temp = t; 13 for(LL i = 2; i * i <= temp; i++) 14 { 15 if(temp % i == 0) 16 { 17 if(temp % (i * i) == 0) 18 return false; 19 temp /= i; 20 } 21 } 22 ans = min(ans,abs(t * t - x)); 23 return true; 24 } 25 void solve() 26 { 27 int flag = 0; 28 LL z = sqrt(x); 29 if(z * z < x) z++; 30 for(LL i = max(z,2LL);;i++) 31 { 32 if(judge(i)) 33 break; 34 } 35 for(LL i=z-1;i>1;i--) 36 { 37 if(judge(i)) 38 break; 39 } 40 41 } 42 int main() 43 { 44 int T; 45 scanf("%d",&T); 46 while(T--) 47 { 48 scanf("%I64d", &x); 49 ans = INF; 50 solve(); 51 printf("%I64d\n",ans); 52 } 53 return 0; 54 }
?4??√?n???log?2??√?n???)
时间: 2024-10-13 00:09:59