bzoj 2173 //2173: 整数的lqp拆分

bzoj 2173   //2173: 整数的lqp拆分   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2173勘误

//一直觉得此文有问题,翻看https://blog.csdn.net/heheda_is_an_OIer/article/details/49862719比较认同,摘抄如下
//这道题样例解释似乎有问题?
//f[1]=1 f[2]=1 f[3]=2
//3=1+1+1 ->1*1*1=1
//3=1+2->1*1=1
//3=2+1->1*1=1
//3=3->2=2
//为此纠结了好久…… 得出方程 dp[i]=sigma(dp[j]*f[i-j])
更多题解,详见https://blog.csdn.net/mrcrack/article/details/90228694BZOJ刷题记录

//觉得挺奇怪,斐波那契数 跟该题什么关系,难道只是暗示需 求和
//还有,该题没有特别说明1*2,中的1,2怎么回事,总之,题意,还是有些不明。
//尝试先模拟:
//n=1 1=1     权值和1
//n=2 2=1+1   权值和1*1=1
//n=3 3=1+1+1 1*1*1=1,3=2+1 2*1=2,3=1+2 1*2=2,权值和1+2+2=5
//n=4 4=1+1+1+1 1*1*1*1=1,4=2+1+1 2*1*1=2,4=1+2+1 1*2*1=2,4=1+1+2 1*1*2=2,4=3+1 3*1=3,4=1+3 1*3=3,4=2+2 2*2=4权值和1+2*3+3*2+2*2=17
//n=5 5=1+1+1+1+1 1*1*1*1*1=1,5=2+1+1+1 2*1*1*1=2,5=1+2+1+1 1*2*1*1=2,5=1+1+2+1 1*1*2*1=2,5=1+1+1+2 1*1*1*2=2,
//5=3+1+1 3*1*1=3,5=1+3+1 1*3*1=3,5=1+1+3 1*1*3=3,5=2+2+1 2*2*1=4,5=2+1+2 2*1*2=4,5=1+2+2 1*2*2=4
//5=4+1 4*1=4,5=1+4 1*4=4,5=2+3 2*3=6,5=3+2 3*2=6;权值和1+2*4+3*3+4*2+2*3*2=
//感觉 跟  斐波那契数 扯不上 关系
//一直觉得此文有问题,翻看https://blog.csdn.net/heheda_is_an_OIer/article/details/49862719比较认同,摘抄如下
//这道题样例解释似乎有问题?
//f[1]=1 f[2]=1 f[3]=2
//3=1+1+1 ->1*1*1=1
//3=1+2->1*1=1
//3=2+1->1*1=1
//3=3->2=2
//为此纠结了好久…… 得出方程 dp[i]=sigma(dp[j]*f[i-j])

//突然发现,前面都是无用功,难怪该题做不出,他人 题解 看不懂。2019-6-13
//意见,题目 还是要有 出题人+做题人 进行组合,否则,题意都有问题,如何解决问题。
//翻了https://www.luogu.org/problemnew/show/P4451发现也是同样的问题,题目抄来抄去的
//重新处理f0=0,f1=1,f2=1,f3=2,f4=3,f5=5
//n=0,0=0,f0=0,g0=0
//n=1,1=1,f1=1,g1=1
//n=2,2=1+1 f1*f1=1,2=2 f2=1,g2=1+1=2
//n=3,3=1+1+1 f1*f1*f1=1,3=1+2 f1*f2=1*1=1,3=2+1 f2*f1=1,3=3 f3=2,g3=1+1+1+2=5
//n=4,4=1+1+1+1 f1*f1*f1*f1=1,4=2+1+1 f2*f1*f1=1,4=1+2+1 f1*f2*f1=1,4=1+1+2 f1*f1*f2=1
//4=3+1 f3*f1=2,4=1+3 f1*f3=2,4=2+2 f2*f2=1,4=4 f4=3
//g4=1+1+1+1+2+2+1+3=12

//此文https://www.cnblogs.com/zyfzyf/p/4008514.html?utm_source=tuicool&utm_medium=referral思路写得不错,摘抄如下
//这种数学题,考虑递推公式:
//n的拆分怎么来?
//1.n-1的拆分中某个数+1
//2.n-1的拆分中加上一个1
//这样的话 g[n]=g[n-1]+g[n-2]+g[n-1]=2*g[n-1]+g[n-2]
//因为 f[x]=f[x-1]+f[x-2]所以相当于多出来个 g[n-2],应该很好理解。

//以n=3  ==>  n=4 为例
//1.n-1的拆分中某个数+1
//3=1+1+1 f1*f1*f1=1,3=1+2 f1*f2=1*1=1,3=2+1 f2*f1=1,3=3 f3=2,
//4=(1+1)+1+1       ,4=(1+1)+2        ,4=(2+1)+1    ,4=(3+1)
//2.n-1的拆分中加上一个1
//3=1+1+1 f1*f1*f1=1,3=1+2 f1*f2=1*1=1,3=2+1 f2*f1=1,3=3 f3=2,
//4=1+1+1+1         ,4=1+2+1          ,4=2+1+1      ,4=3+1

//上述思路直接作罢,觉得有问题

//https://www.cnblogs.com/Trinkle/p/3851811.html此文思路不错,摘抄如下:

bzoj 2173 //2173: 整数的lqp拆分_第1张图片

 //样例通过,提交Wrong_Answer。
//for(i=2;i<=n;i++)g2=(2*g1%mod+g0)%mod,g0=g1,g1=g2;//此处写成 for(i=2;i<=n;i++)g2=2*g1%mod+g0%mod,g0=g1,g1=g2;
//修改,提交AC。%运算优先级应该是高于+运算的。读者可以尝试打印printf("%d",1+1%2);该语句结果,是0还是2呢
//结果为2,以下为AC代码。2019-6-13      
#include
#define mod 1000000007
#define LL long long
int main(){
    int i,n;
    LL g0,g1,g2;
    scanf("%d",&n);
    g0=0,g1=1,g2=1;//g2=1是为了应对n=1的情形
    for(i=2;i<=n;i++)g2=(2*g1%mod+g0)%mod,g0=g1,g1=g2;//此处写成 for(i=2;i<=n;i++)g2=2*g1%mod+g0%mod,g0=g1,g1=g2;
    printf("%lld\n",g2);
    return 0;
}     

你可能感兴趣的:(跟着大佬学算法)