\(Des\)

\(Sol\)

\(upd:\)以下两段是错误做法,但我不想删掉\(.jpg\)

-----------------------以下是错误部分------------------------------

看到问\(\sum_{n-l}^rf(n)\)一定会想到数位\(dp\)叭,于是尝试数位\(dp\),然而并不会做.但是觉得可以先尝试想暴力方法(当然是优秀点的暴力)?

对于一个数\(abcd\),如下变化:\((a+b)(b+c)(c+d)\),\((a+2b+c)(b+2c+d)\),\((a+3b+3c+d)\),注意到其实中间过程中有没有取\(\%\)并没有影响,就这样加起来到最后再取\(\%\)是一样的.看到这里我想到了杨辉三角形.到这里可以得出,对于一个数\(x\),我们可以在\(log_{10}x\)的时间里得出\(f(x)\).然后你就可以去打暴力了.

-----------------------以下是正确部分------------------------------

容易发现,若最后一位的数字变化\(1\),那么其\(f\)值也会变化\(1\).又因为\(f\)值只能取\(0\)到\(1\).所以对于连续的十个数,它们的\(f\)值的和是\(\sum_{i=0}^9i=45.\)于是要算出\(\sum_{i=1}^{l}f(i)\)就要简单多了,先\(as+=45*(l/10)\),然后单独计算一下后面剩下的数就好了(只要暴力计算剩下的数的第一个就好了,其他的都可以推出来).最后的答案就是\(sol(r)-sol(l-1)\).

总结一下,这题似乎不能用数位\(dp\),而且数据范围又那么大,其实可以猜测到一定是有规律的一些数可以捆绑在一起算,这些数捆绑在一起的值又会有一定的规律.(突然想起上个学期做过的一个三角函数的题目,也是连续三个一起算,然后这个值又是是循环起来的).要找出这个规律就一定要去分析这个\(f(n)\)的性质/特殊性.

\(over.\)

\(Code\)

上午脑子很乱,\(Wa\)了\(Inf\)次,中午睡醒后重构一遍,虽然第一遍仍然没有过样例,但是再冷静地查了下错,于是过样例之后一遍\(A\)了.

Code
#include<bits/stdc++.h>
#define il inline
#define Ri register int
#define go(i,a,b) for(Ri i=a;i<=b;++i)
#define yes(i,a,b) for(Ri i=a;i>=b;--i)
#define e(i,u) for(Ri i=b[u];i;i=a[i].nt)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il ll read()
{
ll x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
int a[20];
il ll calc(ll x)
{
Ri ct=0;
mem(a,0);
while(x){a[++ct]=x%10,x/=10;}
while(ct>1)
{
go(i,1,ct-1)a[i]=(a[i]+a[i+1])%10;
--ct;while(!a[ct] && ct>0)--ct;
}
return a[1];
}
il ll sol(ll x)
{
ll ret=(x+1)/10*45,ct=(x+1)%10;
ll qvq=calc(x-ct+1);
while(ct--)
{
ret+=qvq;
qvq=(qvq+1)%10;
}
return ret;
}
int main()
{
int T=(int)read();
while(T--)
{
ll l=read(),r=read();
//printf("sol(%lld)=%lld sol(%lld)=%lld\n",l-1,sol(l-1),r,sol(r));
printf("%lld\n",sol(r)-sol(l-1));
}
return 0;
}

随机推荐

  1. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  2. vue2——指令渲染,{{}}渲染

    博客地址 :https://www.cnblogs.com/sandraryan/ 声明式的渲染,以{{}}的形式调用数据 <!DOCTYPE html> <html lang=&q ...

  3. ORACLE内部操作

    当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. ORACLE Clause 内部操作 ORDER BY SORT ORDER BY UNION UNION-ALL MIN ...

  4. 添加SuperSocket的启动代码到 Windows Azure 的 WorkRole 项目

    与其它SuperSocket程序相同,启动代码同样也要写到程序的入口处,如 Windows Azure 的 WorkRole 项目的OnStart() 方法: public override bool ...

  5. uni-app学习记录04-轮播图和滑屏图片

    <template> <view> <!-- 轮播图视图 swiper-item是每页的元素 --> <swiper :indicator-dots=&quo ...

  6. centos linux mysql 10060远程错误代码

    Navicat for MySQL远程连接数据错误代码10060 1.登陆远程linux服务器命令界面 vim /etc/sysconfig/iptables  进入防火墙配置修改 增加以下两条防火墙 ...

  7. Python--day43--mysql唯一索引和外键变种之多对多

    唯一索引:(unique关键字)unique 名字 (num) 外键的变种:

  8. Wannafly挑战赛15 C“出队”(约瑟夫环类问题)

    传送门 •参考资料 [1]:浅梦无痕 [2]:Esquecer [3]:My CSDN •题意 n 个人围成一圈,1,2 报数,报 1 的离队,求编号为 x 的第几次出队: •对博文[1]的理解 第一 ...

  9. 【u105】路径计数2

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问 ...

  10. js 设置当前时间的后24小时、后一小时等相对时间

    不管是设置相对当前时间有多久时间差的时间,思路:先获取当前时间的时间戳,再根据需求加减时间获得新的时间戳,然后取年月日与时分秒.实例: // 设置默认时间——先转化为毫秒数,加上 24 小时的毫秒数, ...