A题
子序列和啊,就要想到前缀和的差。这个转换一定要!记着!那么i到j的一段子序列和Sij%m == 0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一样的,那么是不是就存在着一段子序列满足条件了,然后注意一下边边角角应该就没问题了。
因为ZOJ坏掉了,所以我尚未验证以下答案的ans是否就是满足条件的序列总数!移步ZOJ1569自行验证。
#include <cstdio> #include <set> #include <map> #include <queue> #include <cmath> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; + ]; int main() { int t; scanf("%d",&t); while(t--) { ,sum = ; memset(num,,sizeof(num)); scanf("%d%d",&n,&m); ; i < n; i++) { scanf("%d",&x); sum = (sum + x) % m; ) ans++; num[ sum ]++; } ; i< m; i++) { ans += (num[i] - ) * num[i] / ; } ) printf("YES\n"); else printf("NO\n"); } ; }
B题(思路)
这个应该算是个贪心。真尼玛= =,脑洞题。
我也不知道怎么讲比较好,自己拿个笔和纸琢磨一下,应该就搞懂了,网上那些题解说的感觉也不好。还是要拿笔,照这个程序,手动模拟一下,应该就能搞懂了。
#include <cstdio> #include <set> #include <map> #include <queue> #include <cmath> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; typedef long long LL; const int INF = 0x3f3f3f3f; ; int a[maxn]; int main() { int t,n,m; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); ; i < n - ; i++) scanf("%d", &a[i]); sort(a, a + n - ); LL ans = n; ; i< n - m; i++) ans += a[i]; printf("%I64d\n", ans); } ; }
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啊,巴拉巴拉啦。打高亮了。
#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; typedef long long LL; const LL INF = 0x3f3f3f3f3f3f3f3fll; LL x,z,ans; bool judge(LL t) { ) return false; LL temp = t; ; i * i <= temp; i++) { ) { ) return false; temp /= i; } } ans = min(ans,abs(t * t - x)); return true; } void solve() { ; LL z = sqrt(x); if(z * z < x) z++; for(LL i = max(z,2LL);;i++) { if(judge(i)) break; } ;i>;i--) { if(judge(i)) break; } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%I64d", &x); ans = INF; solve(); printf("%I64d\n",ans); } ; }
4√nlog2√n)