BestCoder Round #85(ZOJ1569尚未验证)

时间:2022-06-08 18:40:43

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​​√​n​​​log​2​​√​n​​​)