2017 사천성 새엘나이스 트릭 사유+dp

2395 단어 사유dp
PDF
제목:
제목은 임의의 수에서 세 개의 수를 골라서 곱하고 합친 공식을 주었습니다. 이제 임의의 수에서 네 개의 수를 골라서 곱하고 합친 다음에 마지막 답안을 물어보세요. 1e9+7에 대한 모범을 얻으세요.
아이디어:
이 문제는 정말 내 솥이다. 시합 후에 팀원들에게 한바탕 자극을 받아 막다른 골목으로 들어갔다. 그때 세 가지 공식을 주었기 때문에 나는 네 가지 공식을 밀어야 한다고 오도했다.결국 5시간, 정말 5시간, 나는 계속 밀고 있다가 죽어라 나오지 못했다...
사실 이 문제는 정말 엉터리이다. 첫 번째 방법은 dp야. dp[i][j]는 전 i개수이고 임의의 j항의 곱셈의 합이 얼마면 다음과 같은 방정식을 내놓을 수 있다.
dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*ai, 그리고 경계를 처리하면 됩니다...
우리는 네 가지를 구하기 때문에 j는 최대 4이고 복잡도는 O(n)이다.
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+10;
int n;
ll a[maxn];
ll dp[maxn][10];
ll ans;
int main(){

	while(~scanf("%d",&n))
	{
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
		dp[1][1]=a[1];
		for(int i=2;i<=n;i++)
		{
			for(int j=1;j<=min(i,4);j++)
			{
				if(j==1)
				{
				dp[i][j]=dp[i-1][j]+a[i];
				dp[i][j]%=mod;
				}
				else
				{
					dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*a[i];
					dp[i][j]%=mod;
				}
			}
		}
		printf("%lld
",dp[n][4]); } return 0; }

또 다른 사고방식은 네가 네 가지 곱셈을 요구하고 너에게 세 가지 곱셈의 합을 주었으니 너는 이용해야 한다!!!우리는 i개수에 대해 그 앞의 i-1개수에 대해 3개를 곱해서 그것과 더하는 것은 i를 추출하는 것과 같다. 앞의 i-1개수는 임의의 3항의 곱셈의 합을 취하고 다시 i를 곱한다.그러면 이 세 항목의 곱셈과 공식이 쓸모가 있을 것이다.
(i 뒤에 있는ai가 포함된 것은 뒤에 있는 것으로 해결하면 중복을 피할 수 있다)
복잡도도 O(n)와 비슷하다.
우리는 하나만 계산하고 대응하는 a[i]를 안에 넣으면 돼...매거의 번거로움을 덜었다.
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+10;
int n;
ll a[maxn];
ll ans;
ll quick(ll x,ll y)
{
	ll res=1;
	while(y)
	{
		if(y&1)
		res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res%mod;
}
ll inv6=quick(6,mod-2);
ll solve(ll x,ll y,ll z)
{
	 ll s=0;
	 s=quick(x,3);
	 s=(s-3*x*y%mod+mod)%mod;
	 s=(s+2*z)%mod;
	 return s*inv6%mod;
}
int main(){

	while(~scanf("%d",&n))
	{
		ll x=0,y=0,z=0;
		ans=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);		
			if(i>3)
			{
				ans=(ans+solve(x,y,z)*a[i]%mod)%mod;
			}
			x=(x+a[i])%mod;
			y+=quick(a[i],2);
			z+=quick(a[i],3);
			y%=mod;
			z%=mod;
		}
		printf("%lld
",ans); } return 0; }

좋은 웹페이지 즐겨찾기