博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【luogu 2529】【SHOI 2001】击鼓传花
阅读量:6788 次
发布时间:2019-06-26

本文共 1444 字,大约阅读时间需要 4 分钟。

【原题题面】

【题解大意】

写得太清晰易懂了,我就不赘述了。

讲讲在上面那篇博客中没有直接写出来但是可能影响理解的东西:

f(x) = f(x/5) × a(x % 20)

已知非零的最后一位一定是偶数之后,我们考虑把每20个数分成一组,这样他们相乘4*4%10==6

对后面分不成一块的数的乘积(无论为多少,都毫不影响。

算法的实现:

我们给出的数记作x,起答案为ans[x]。

1.高精%单精(20) = y;

2.答案记作为ans[x] = a[y]*ans[x/5];

ans[x] = a[y]*ans[x/5] = a[y1]*a[y2]*ans[x/5/5] = ...

直到 x<20.

关于a数组的预处理应该为:

1,2,3,4,1/2,5,6,7,8,9,1/2,11,12,13,14,1/2,16,17,18,19,1/2的前缀乘并且时刻记住%10。

每20个数分组,所以分不到组内的数的个数小于20.即我们需要预处理的数的个数小于20。

【code】

#include
using namespace std;#define File ""#define ll long longinline void file(){ freopen(File".in","r",stdin); freopen(File".out","w",stdout);}const int mxn = 110;char s[mxn];int T,a[mxn],b[22],n;inline int calc1(){ return (a[2]*10+a[1]) % 20;}inline void calc2(){ int t = 0; for(int i = n;i >= 1; --i){ t = t*10+a[i]; a[i] = t/5; t = t%5; }}int ans;int main(){// file(); T = 5,b[0] = 1; for(int i = 1;i <= 20; ++i){ if(!(i%5)) b[i] = b[i-1]/2%10; else b[i] = b[i-1]*i%10; }// for(int i = 1;i <= 20; ++i) printf("%d ",b[i]);// puts(""); while(T--){ scanf("%s",s+1); n = strlen(s+1); for(int i = 1;i <= n; ++i) a[n-i+1] = s[i]-'0'; ans = 1; while(n > 0){ while(a[n]==0) n--; ans = ans*b[calc1()]%10; calc2(); } printf("%d\n",ans); } return 0;}/*1112131415*/
View Code

 

转载于:https://www.cnblogs.com/ve-2021/p/11076619.html

你可能感兴趣的文章
选择器 :gt(index)
查看>>
notes on python
查看>>
kafa
查看>>
资源 | Feature Tools:可自动构造机器学习特征的Python库
查看>>
linux Shell 中常用的条件判断
查看>>
angular 动态设置blob链接给 ng-href时遇到unsafe 解决方案
查看>>
Java与Highcharts实例(四) - Hello Highcharts (后台Java传递数
查看>>
连接数据库的操作 总结
查看>>
Android 小米手机开发APP图标更换后还显示原来的图标
查看>>
在代码中修改Shape的solid属性的color值
查看>>
MySQL字符集问题
查看>>
Java多线程总结
查看>>
iPad Mini外屏碎了 换屏幕教程
查看>>
LinkedBlockingQueue操作,线程安全问题,ConcurrentModificationException 异常分析与解决方案...
查看>>
redis3.2新功能--GEO地理位置命令介绍与实战开发
查看>>
java 通过ssh 执行命令
查看>>
算法导论——基数排序(基于计数排序)
查看>>
19.TCP的交互数据流
查看>>
字符串匹配的Boyer-Moore算法
查看>>
memcached数据库未授权访问漏洞解决
查看>>