HDU5976(법칙찾기+페마소정리구역원)
#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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU5976(법칙찾기+페마소정리구역원)이 문제는 처음에 간단한 DP인 줄 알았는데 시간이 초과되었다. 나도 절망했다. 나중에 DP의 사고방식으로 할 수 없다는 것을 발견했다. 왜냐하면 중복된 숫자가 나오지 않기 때문이다.그리고 법칙을 찾는 문제라고 생각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.