D. Twist the Permutation

D. Twist the Permutation_第1张图片

原题链接 

思路:

        推导之后不难发现不存在无法实现的数据。通过逆向思维,从最终数组往前推,,推之前记录下所有的位置输入状态:3 2 5 6 1 4记录所所处位置的s数组为{0,5 ,2,1,6,3,4}(即数字1处在5号位置)。随后通过对i取余,从而判断是通过几次步骤得到的

os:怎么题目就没看懂没有思路的呢?

#include
#include
#include
#include
#include
#include
#include
//#include
#include
#include
//#include 
#include
#include
#include
#define dbug cout<<"hear!"<=c;a--)
#define no cout<<"NO"<,greater >q;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair PII;
typedef pair PDD;
const int N = 1e5 + 5;
const int  INF = 0x3f3f3f3f;
//const ll LINF=LLONG_MAX;
// ll gcdd(ll a, ll b)
// {
//       while(b^=a^=b^=a%=b);    
//       return a;
// }
// void add(ll a,ll w)
// {
//   noda[++idx].b=w;
//   noda[idx].ne=h[a];
//   h[a]=idx;
// }
// void get_prims()
// {
//   rep(i,2,n)
//   {
//     if(!book[i])arr[cnt++]=i;
//     for(ll j=0;arr[j]<=n/i;j++)
//     {
//       book[arr[j]*i]=true;
//       if(i%arr[j]==0)break;
//     }
//   }
// }
ll h[N],idx;
const ll mod =1000000007;
ll  t, n,a,b,c,d, m, x,y, k, cnt, ans, ant, sum,q,p,num;
ll arr[N],brr[N], crr[N];
ll book[N];

int main()
{
  IOS;
  cin>>t;
  while(t--)
  {
    cin>>n;
    rep(i,1,n)
    {
      cin>>x;
      arr[x]=i;
    }
    per(i,n,1)
    {
      ant=arr[i]%i;
      brr[i]=ant;
      rep(j,1,n)
      {
        arr[j]-=ant;
        if(arr[j]<1)
        {
          arr[j]+=i;
        }
      }
    }
    rep(i,1,n)
    {
      cout<

你可能感兴趣的:(c++,算法,c语言)