图片说明

  • 题意:

  • 给出n和q,输出从q,2q,3q....n的个位数的和

  • 题解:

  • 很明显就是有规律,手动找循环即可

  • 代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    int flag[11];
    ll a[10010];
    int main()
    {
      int t,n;
      scanf("%d",&t);
      while(t--)
      {
          ll i,n,m,cnt = 0;
          memset(flag,0,sizeof(flag));
          scanf("%lld%lld",&n,&m);
          if(n < m){
              cout<<"0"<<endl;
              continue;
          }
          int c = 0;
          for(i=m;i<=n;i+=m)
          {
              int k = i%10;
              if(flag[k]){
                  break;
              }
              else{
                  cnt += k;
                  a[++c] = cnt;
                  flag[k] = 1;
              }
          }
          if(i == n+m)
          {
              cout<<cnt<<endl;
              continue;
          }
          i -= m;
          ll ans = cnt*(n/i);
          if(n%i == 0){
              cout<<ans<<endl;
              continue;
          }
          ll k = n%i;
          ans += a[k/m];
          cout<<ans<<endl;
    
      }
      return 0;
    }

图片说明

  • 题意:
  • 本题有俩个难度,唯一区别是n的个数不一样。
  • 给出n个数和k,每次执行选择一个数除以2,问你让这个数列k个数相等的最少执行次数。
  • 题解:
  • 排一遍序,因为n<=2e5,顶多可以除17次,所以直接递归求答案就行。
  • 代码:
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxx = 2e5+10;
    int a[maxx],ans[maxx],cnt[maxx];
    int n,k,minn = 1e9+7;
    void solve(int x,int y)
    {
      cnt[x]++;
      ans[x] += y;
      if(cnt[x] == k)
          minn = min(minn , ans[x]);
      if(x == 0)
          return ;
      solve(x/2,y+1);
    }
    int main()
    {
      scanf("%d%d",&n,&k);
      for(int i=1;i<=n;i++){
          scanf("%d",&a[i]);
      }
      sort(a+1,a+1+n);
      for(int i=1;i<=n;i++){
          solve(a[i],0);
      }
      cout<<minn<<endl;
      return 0;
    }