今天比赛换了一个位置,emmm?排除风水影响……
预计得分 100+10+??
实际得分 60+0+30
先说第一题,比较水
通过组合数可以退出一个公式
化简之后得 2^n-1*(n-2)+1
其实我是观察找规律……
我们把1到n的区间中任意砍一刀,固定前区的最后一个数
例如:1 2 3 4 5
在三和四中间砍一刀 固定三 前区的组合方式就是C2 1,后区是C2 1,相乘即可
但是60分的原因是乘积爆long long了……
所以还要用快速乘(注意要在快速幂里用)
代码如下:
#include<bits/stdc++.h> #include<cctype> using namespace std; char buf[1<<20],*p1,*p2; #define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++) template<class T> inline void read(T &n){ char ch=GC;T w=1,x=0; while(!isdigit(ch)){if(ch=='-') w=-1;ch=GC;} while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=GC;} n=x*w; } long long mod; long long anss; inline long long cheng(long long a,long long b){ return (a*b-(long long)((long double)a/mod*b)*mod+mod)%mod; } long long ksm(long long a,long long b) { long long ans=1; while(b) { if(b&1)ans=cheng(ans,a)%mod; a=cheng(a,a)%mod; b=b/2; } return ans; } int main() { long long n; cin>>n>>mod; long long f=ksm(2,n-1)%mod; anss=cheng(f,(n-2))%mod; anss+=1; anss%=mod; cout<<anss; }