JZOJ 4799. 我的快乐时代

Problem

Description

这里写图片描述

Input

一行,两个整数l,r 。

Output

一行,一个整数,表示第l 天到第r 天的愉悦值的和。

Sample Input

Input 1
64 89
Input 2
3 233
Input 3
2333333333 66666666666666

Sample Output

Output 1
1818
Output 2
8730
Output 3
836269739

Data Constraint

这里写图片描述

Solution

其实我们并不用这么慌张。解题思想:分治
我们一位一位求答案,从左到右一位一位地固定。
假如要求1-4386的答案,那么我们可以分为:
1-999
1000-3999
4000-4299
4300-4379
4380-4385
4386
第一组最特殊,因为它跨了不止一个十进制位。
每一轮,我们进行以下操作:
如果它是最中间的那一位(此时总位数是单数),那么答案加上 (12+22+...+92) *个数。
像下图,个数为每一位能放置的数的乘积。
这里写图片描述
如果不是最中间的那一位,那么答案加上45*45*方案数*2
(不要问我为什么*2,自己想。PS:45=1加到9,也等于0加到9)。
这里写图片描述

fo(i,1,a[0]-1)
{
    gs*=s[i];
    fo(j,1,i/2) sum=(sum+((gs/s[j]/s[i-j+1])%mo*2*45*45)%mo)%mo;
    if (i%2) sum=(sum+((gs/s[i/2+1])%mo*285)%mo)%mo;
    //算出总方案数,然后除以相应位置上的方案数,这样比一个一个位的方案数乘起来更快更方便
}

如果固定一位,那么固定的那位的方案数只能是1种。
其他步骤跟上述方法差不多,只需要研究一下固定后怎么搞就行了。
附:建议看多几个数组存一下认为重要的几个值,这样使思路更加清晰,改题改得更快。

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#define LL long long
#define mo 1000000007
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
LL I,L,R,gs,s1[20],s2[20],a[20],s[20],d[20],ans;
LL doit(LL x)
{
    LL i,j,sum=0;
    memset(a,0,sizeof(a));
    memset(d,0,sizeof(d));
    memset(s,0,sizeof(s));
    while (x)
    {
        a[++a[0]]=x%10;
        x/=10; 
    }
    s[1]=9;fo(i,2,a[0]) s[i]=10;
    fo(i,1,a[0]) d[i]=45;
    gs=1;
    fo(i,1,a[0]-1)
    {
        gs*=s[i];
        fo(j,1,i/2) sum=(sum+((gs/s[j]/s[i-j+1])%mo*2*45*45)%mo)%mo;
        if (i%2) sum=(sum+((gs/s[i/2+1])%mo*285)%mo)%mo;
    }
    s[a[0]]=9;s[1]=10;
    fd(i,a[0],1)
    {
        if (!a[i] || i==a[0] && a[i]==1)
        {
            s[i]=1;
            d[i]=a[i];
            continue;
        }
        if (i==a[0]) s[i]=a[i]-1;
                else s[i]=a[i];
        gs=1;
        fo(j,1,i) gs=gs*s[j];
        d[i]=s1[a[i]-1];
        fo(j,1,a[0]/2)
            sum=(sum+((gs/s[j]/s[a[0]-j+1])%mo*2*d[j]*d[a[0]-j+1])%mo)%mo;
        if (a[0]%2)
        {
            if ((a[0]/2+1)>i)  sum=(sum+((gs/s[a[0]/2+1])%mo*a[a[0]/2+1]*a[a[0]/2+1])%mo)%mo;else
            if ((a[0]/2+1)==i) sum=(sum+((gs/s[a[0]/2+1])%mo*s2[a[a[0]/2+1]-1])%mo)%mo;else
            if ((a[0]/2+1)<i)  sum=(sum+((gs/s[a[0]/2+1])%mo*s2[9])%mo)%mo; 
        }
        s[i]=1;
        d[i]=a[i];
    }
    fo(i,1,a[0]) sum=(sum+a[i]*a[a[0]-i+1])%mo;
    return sum;
}
int main()
{
     scanf("%lld%lld",&L,&R);
     fo(I,1,9) s1[I]=s1[I-1]+I,s2[I]=s2[I-1]+I*I;
     ans=((doit(R)-doit(L-1))%mo+mo)%mo;
     printf("%lld",ans);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值