第二组数据中{1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1}都合法,所以答案是6 mod 5 = 1。
1002 zhx and contest
如果n=1,答案是1,否则答案是2n−2。
证明:ai肯定是最小的或者最大的。考虑另外的数,如果它们的位置定了的话,那么整个序列是唯一的。
那么ai是最小或者最大分别有2n−1种情况,而整个序列单调增或者单调减的情况被算了2次,所以要减2。
要注意的一点是因为p>231,所以要用快速乘法。用法与快速幂相同。如果直接乘会超过long long范围,从而wa掉。
#include<iostream> #include<cstring> #include<string> #include<cmath> #include<map> #include<queue> #include<cstdio> #include<vector> #include<algorithm> using namespace std; const int maxn=1000005; const int inf=210000; typedef long long ll; ll mod; ll mul(ll a,ll b)//原理和快速幂一样,a^b表示b个a相乘,a*b表示b个a相加,所以直接改写即可 { ll ans=0; while(b) { if(b&1) ans=(ans+a)%mod; a=(a+a)%mod; b>>=1; } return ans; } ll pow(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=mul(ans,a);//这里的相乘,写成函数,避免相乘的时候溢出 a=mul(a,a); b>>=1; } return ans; } int main() { ll n; while(~scanf("%lld %lld",&n,&mod)) { if(n == 1) printf("%lld\n",n%mod); else printf("%lld\n",((pow(2ll,n)-2)+mod)%mod); } return 0; }