2015年3月9日 星期一

[TIOJ 1511] Problem A. 雷射防護網

作法:

直角三角形個數顯然,而鈍角三角形的個數比較好算,所以銳角就用全部扣掉直角和鈍角就好。至於鈍角的算法,考慮這個三角形在圓上分出來的三段圓弧,可以知道其實就是要求滿足 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) ;
    }
}
 

沒有留言:

張貼留言