题意:将n依次分割成1->n块,每块和为n,问共有多少种分法。 |
思路:
隔板法,分割成k块的时候,即是n-1个间隙里放入k-1个隔板。C(k-1,n-1),累加,利用二项式定理即是求2n-1。
但是由于n太大,需要用费马小定理降幂。因为2和p互质,那么2p-1和1对p同余,那我们看2n-1能分出多少个2p1,这部分利用同余定理就都变成乘1,只需要求出2(n-1)%(mod-1)即可,指数在1e9+8以内,这个时候利用快速幂就可以快速求出来了
AC代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define pb push_back
#define mp make_pair
#