t(t<=1e6)组样例,每次给定一个n(n<=1e9),统计边长为n的上述三角形的等边三角形个数
其中等边三角形的三个顶点,可以在所有黑色三角形&白色三角形的顶点中任取,
答案对1e9+7取模
申老师 & oeis A000332
oeis打一下前四项的表,发现是C(n,4),并且还有说明,
是等于长度为n时的等边三角形,任取顶点时,不限边长大小的等边三角形个数
看了一下证明,感觉也是变相计数,这里提供一种计数方式,可能赛中还是会选择打表吧
对于边长为n的三角形,三个点都在三角形的三条边上的方案,恰有n种
图示分别对应n=2,3,4的情形,
所以,可以枚举每个边长i,统计边长=i的正向的三角形的个数,每个的贡献是i
因为倒立的边长为i的三角形,会在正向为2*i的三角形中被枚举到,所以忽略
归纳/找规律可发现,边长为n-i+1的正向三角形的出现次数是i*(i+1)/2,有下式成立:
从n+3个数选4个数时,可以枚举第三个数的位置,左边i+1个位置选2个,右边选1个
但是确实没有看出来其与三角形选择方法的关联关系
输出C(n+3,4)即可,即(n+3)*(n+2)*(n+1)*n/24
- #include
- using namespace std;
- #define rep(i,a,b) for(int i=(a);i<=(b);++i)
- #define per(i,a,b) for(int i=(a);i>=(b);--i)
- typedef long long ll;
- typedef double db;
- typedef pair<int,int> P;
- #define fi first
- #define se second
- #define dbg(x) cerr<<(#x)<<":"<
" " ; - #define dbg2(x) cerr<<(#x)<<":"<
- #define SZ(a) (int)(a.size())
- #define sci(a) scanf("%d",&(a))
- #define pb push_back
- #define all(a) a.begin(),a.end()
- #define pt(a) printf("%d",a);
- #define pte(a) printf("%d\n",a)
- #define ptlle(a) printf("%lld\n",a)
- #define debug(...) fprintf(stderr, __VA_ARGS__)
- std::mt19937_64 gen(std::chrono::system_clock::now().time_since_epoch().count());
- ll get(ll l, ll r) { std::uniform_int_distribution
dist(l, r) ; return dist(gen); } - const int mod=1e9+7,inv2=(mod+1)/2,inv6=(mod+1)/6;
- int t,n;
- int sol(int x){
- int a=1ll*(n+3)*(n+2)%mod*inv6%mod;
- int b=1ll*(n+1)*n%mod*inv2%mod*inv2%mod;
- return 1ll*a*b%mod;
- }
- int main(){
- sci(t);
- while(t--){
- sci(n);
- printf("%d\n",sol(n));
- }
- return 0;
- }