A
//由求和公式(n*(n-1))/2知道当n为偶数就行,我们将每个序号乘以2就满足了
#include <iostream> using namespace std; const int N =210; int t; int n; int main() { cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++){ cout<<i*2<<' '; } cout<<endl; } return 0; }
B
开始读假了,题目描述对于j,i交换使得a[i]==i(即让序号上的数为序号值),每次交换的距离为a[i]-i(需要绝对值),
如果使得每个序号满足的话每次可以移动每个距离的因子次数,而全部满足的最大距离就是最大公因子
求一次GCD即可
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int a[N]; int t; int n; int main(){ cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } int ans=abs(a[1]-1); for(int i=2;i<=n;i++){ ans=__gcd(ans,abs(a[i]-i)); } cout<<ans<<endl; } return 0; }
C
//对b[i]二分查找,寻找最小的大于等于a[i]的下标,说明该下标之前可以放入a[i]但是每次放入下次放入就会少一次选择,所以用一个计数器cnt统计已经占了多少位置
#include <bits/stdc++.h> using namespace std; #define endl '\n' #define LL long long #define ph push_back #define INF 0x3f3f3f3f #define PII pair<int, int> const int N = 2e5 + 10; const int MOD = 1e9 + 7; int t; int n; LL a[N]; LL b[N]; void solve() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + n); LL res = 1; LL cnt = 0; for (int i = 1; i <= n; i++) { LL pos = (lower_bound(b + 1, b + 1 + n, a[i]) - b) - 1; //找到b中最小的大于等于a[i]的位置,那么a[i]可以放在该位置前面,并且占一个位置 res = (res * (pos - cnt)) % MOD; cnt++; } cout << res % MOD << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); cin >> t; // t = 1; while (t--) { solve(); } return 0; }
标签:const,int,LL,Codeforces,cin,873,序号,Div,define From: https://www.cnblogs.com/xumaolin/p/17403151.html