Codeforces Round #728 (Div. 2)-B. Pleasant Pairs

传送门

题意:

给你一串数字,求满足 a i + a j = i + j a_i+a_j=i+j ai+aj=i+j且i<j的序列对数。

思路:

对于第i个数,仅当下标j满足 ( j + i ) = a i + a j (j+i)=a_i+a_j (j+i)=ai+aj时合法,也就是说,每次应选择j+i为 a i a_i ai的倍数的下标。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
#define ll long long
#define mod 4933ll
ll a[100010];

int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		for(int i = 1; i <= n; i++)
		{
    
    
			cin>>a[i];
		}
		ll ans = 0;
		for(ll i = 1; i <= n; i++)
		{
    
    
			ll j = a[i]-i;
			if(j < i)
			{
    
    
				ll k = 2*i/a[i];
				j = k*a[i]-i+a[i];
				
			}
			for(; j <= n; j+=a[i])
			{
    
    
				if(a[i]*a[j]==i+j) ans++;
			}
		}
		cout<<ans<<endl;
	}
}

おすすめ

転載: blog.csdn.net/p15008340649/article/details/119655958