HDU5976(법칙찾기+페마소정리구역원)

4991 단어 hdu수학.
이 문제는 처음에 간단한 DP인 줄 알았는데 시간이 초과되었다. 나도 절망했다. 나중에 DP의 사고방식으로 할 수 없다는 것을 발견했다. 왜냐하면 중복된 숫자가 나오지 않기 때문이다.그리고 법칙을 찾는 문제라고 생각했어.휘형이 찾아낸 규칙, 그리고 나는 내 생각을 말하고 수업하러 갔다.오늘 이 문제를 보충한다.code:
#include 
#include 
#include 
#include 
using namespace std;
#define LL long long
const int maxn = 1e5;
const LL mod = 1e9+7;

LL add[maxn], mul[maxn];

LL quickmi(LL a,LL b)
{
    LL res=1;
    while(b!=0)
    {
        if(b%2==1)
        {
            res*=a;
            res=res%mod;
        }
        b=b/2;
        a=a*a%mod;
    }
    return res;
}

LL inv(LL a, LL n)
{
    return quickmi(a,n-2);
}

void init()
{
    memset(add, 0, sizeof(add));
    memset(mul, 0, sizeof(mul));
    add[0] = add[1] = 1;
    add[2] = 2;
    mul[0] = mul[1] = 1;
    mul[2] = 2;
    for(LL i = 3; i < maxn; i++){
        add[i] = add[i-1]+i;
        mul[i] = (mul[i-1]*i)%mod;
    }
}

int main()
{
    init();
    LL T, x;
    scanf("%I64d", &T);
    while(T--)
    {
        scanf("%I64d", &x);
        if(x <= 4)
        {
            printf("%lld
"
, x); continue; } int l=2,r=maxn-5; while(l < r) { int mid = (l+r+1)/2; if(add[mid] <= x) l = mid; else r = mid-1; } LL temp = x - add[l]; if(temp == l) printf("%lld
"
, mul[l]*inv(2, mod)%mod*(l+2)%mod); else if(temp == 0) printf("%I64d
"
, mul[l]); else printf("%lld
"
, mul[l-temp]*mul[l+1]%mod*inv(mul[l-temp+1], mod)%mod); } return 0; }

좋은 웹페이지 즐겨찾기