Permutation
思路:每次选择2∗x%n,3∗x%n,如果两个都选择了,就输出‘-1’;

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=1e6+10;
bool vis[maxn];
int main()
{
int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
         int flag=0,b;
        cin>>b;
        memset(vis,0,sizeof(vis));
        vector<int>s;
        int j=0;
        vis[1]=1;
        s.push_back(1);
       while(1)
       {
           if(s.size()==b-1)
               break;
           int u=s[j++];
           int temp1=2*u%b,temp2=3*u%b;
           if(vis[temp1]==0)
               {
                   vis[temp1]=1;
                   s.push_back(temp1);
               }

           else if(vis[temp2]==0)
           {
                vis[temp2]=1;
                   s.push_back(temp2);
           }
           else
           {
               flag=1;
               break;
           }
         }
        if(flag)
        {
            cout<<"-1"<<endl;
        }
        else
        {
            for(int k=0;k<s.size();k++)
                cout<<s[k]<<" ";
            cout<<endl;
         }
      }
    return 0;
    }

Game
思路:从左到右将所选择的数到初始的数平分,如果不能平分,则分为2总数,两总数相差不超过1,每次选择最大的数。

#include<iostream>
using namespace std;
const int maxn=1e5+10;
long long int a[maxn],pre[maxn];
int main()
{
int n;
cin>>n;
while(n--)
{
long long int x=-1;
 int t;
   scanf("%d",&t);
    pre[0]=0;
    for(int i=1;i<=t;i++)
    {
        scanf("%lld",&a[i]);
        pre[i]=pre[i-1]+a[i];
        long long z=pre[i]/i;
        if(pre[i]%i!=0)
    {
        z++;
    }
        x=max(x,z);
    }
    printf("%lld\n",x);
}
 return 0;
}