逆序对题解
逆序对
https://ac.nowcoder.com/acm/problem/14731
题意:就是输出在长度为N的各种01串里面能够找到的1在前面0在后面这种位置的字符,你能在这个很多长度为N的串里面找到多少个。
首先,看到数据1e18肯定是一个规律题,所以我们仔细想一下,我们先把1和0在长度为N的串里面弄出来,有序排列 无序组合,既然题意要求1在前,所以我们不能考虑顺序 只能组合,那么就是C(N,2),然后是不是我们就应该枚举剩下的各种类型的串了,是不是我们先已经选出来了1,0的位置组合好啦,现在就和剩下的N-2的串相互*,然后就是我们的数量啦,N-2的长度 我们每个位置只有0或者1的选择是吧,每个位置就是2种选法那么N-2个位置是不是就是2^(N-2),注意开longlong还有mod.我很无语的是我直接一步出答案但是只有13分,最后我分布去计算就过啦。
#include <bits/stdc++.h> #define fio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define debug(x) cout << #x << ": " << x << endl; #define debug1(x) cout<<"xxx"<<endl; #define ll long long #define ull unsigned long long #pragma GCC optimize("Ofast","inline","-ffast-math") #pragma GCC target("avx,sse2,sse3,sse4,mmx") #define mse(a,b) memset(a,b,sizeof b); using namespace std; const int maxx=1e6+100; const int mod=1e9+7; ll qpow(ll a,ll b) { ll ans=1; while(b>0) { if(b&1) ans=(a*ans)%mod; b>>=1; a=(a*a)%mod; } return ans%mod; } int main() { ll a; cin>>a; ll sum=(a%mod)*((a-1)%mod)/2%mod; ll daan=sum*qpow(2,a-2)%mod; cout<<daan<<endl; return 0; }