直角三角形個數顯然,而鈍角三角形的個數比較好算,所以銳角就用全部扣掉直角和鈍角就好。至於鈍角的算法,考慮這個三角形在圓上分出來的三段圓弧,可以知道其實就是要求滿足 x+y+z=n 且 x>=1 , y>=1 , z>=k+1 的整數解個數,其中 k 是 n 一半附近那個數。所以就可以用重複組合的公式算了。但這題 n 到 3*10^6 ,很容易連 long long 都爆了,所以我把要算的東西先展開,變成一個二次式乘一個一次式,就可以避免爆掉了。
code :
#include<bits/stdc++.h> #define LL long long using namespace std; main() { LL n ; char s[20],t[20] ; while(scanf("%lld%s%s",&n,s,t)!=EOF) { LL k=n/2 ; LL ans ; if(n%2) { if(s[0]=='R') ans=0 ; else if(s[0]=='O') ans=n*((n-k-1)*(n-k-2)/2) ; else { ans=-2*n*n+(6*k+6)*n-3*k*k-9*k-4 , ans/=2 ; if(ans%3==0) ans=(ans/3)*n ; else ans=ans*(n/3) ; } } else { if(s[0]=='R') ans=k*(2*k-2) ; else if(s[0]=='O') ans=n*((n-k-1)*(n-k-2)/2) ; else { ans=-2*n*n+(6*k+6)*n-3*k*k-9*k-4 , ans/=2 ; if(ans%3==0) ans=(ans/3)*n ; else ans=ans*(n/3) ; ans=ans-k*(2*k-2) ; } } printf("%lld\n",ans) ; } }
沒有留言:
張貼留言