博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LOJ6368:请让本题永远沉睡于此——题解
阅读量:6176 次
发布时间:2019-06-21

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

给一个分数,求对p=1e9+7取模的值。

给高一同学出的毒瘤模拟题,正好试试给loj传题,竟然过审了,虽然个人觉得很水,但是考试情况来看仅有一人得到了21分的好成绩

可能坑有点多。

1.作为一个不细心的普及组选手如何得到0pts的好成绩

这这这不是水就能过吗?

费马小定理或扩欧求逆元不就可以了吗。

emmm高精度太难写,弃了吧。

反正51pts够了。

 

2.作为一个不细心的提高组选手只会做D1T1如何得到0pts的好成绩

这这这不是水就能过吗?

费马小定理或扩欧求逆元不就可以了吗。

高精度不就是a*b^(p-2)%p=a*(b%p)^(p-2)吗?

就敲一个高精除低精就行了。

100pts美滋滋。

 

3.作为一个不太细心的普及组选手如何得到21pts的好成绩

这这这不是水就能过吗?

费马小定理或扩欧求逆元不就可以了吗。

emm把分母为0的情况特盘掉,然后看一下提示。

woc出题人良心大大的坏,需要把负号提出来,不然第二个样例会输出500000003。

这样应该就有51pts了吧。

 

4.作为一个细心的普及组选手如何得到51pts的好成绩

咦30pts的包也不需要高精啊为什么单独拿出来呢?

哦如果分母是p的倍数的话不就没有逆元就无解了吗?

等等还要特判分子分母都有p这个因子的情况。

哇真的有51pts啊!

 

5.作为一个细心的提高组选手只会做D1T1如何得到100pts的好成绩

高精度的话有可能分子和分母有多个p因子。

那么我就暴力对上下同时除p直到有余数为止。(因为二者都是0说明可能还没有除尽)

判断分母余数为0且分子不为0就无解。

否则就费马小定理/扩欧计算即可。

100pts轻松到手。

 

代码有点丑,也懒得改写了。

#include
#include
#include
using namespace std;typedef long long ll;const ll p=1e9+7;ll qpow(ll k,ll n){ if(n==0)return 1; if(n==1)return k%p; ll h=qpow(k,n/2)%p; if(n%2==0)return h%p*h%p; return h%p*h%p*k%p;}char a[10010],b[10010];ll c[10010],d[10010];ll g[10010],h[10010];ll e1=0,e2=0;int s1,s2;bool w=1;inline void init(){ scanf("%s%s",a,b); if(a[0]=='-'){ s1=strlen(a)-2; w=1-w; for(int i=0;i<=s1;i++){ c[i]=a[i+1]-'0'; } }else{ s1=strlen(a)-1; for(int i=0;i<=s1;i++){ c[i]=a[i]-'0'; } } if(b[0]=='-'){ s2=strlen(b)-2; w=1-w; for(int i=0;i<=s2;i++){ d[i]=b[i+1]-'0'; } }else{ s2=strlen(b)-1; for(int i=0;i<=s2;i++){ d[i]=b[i]-'0'; } } return;}int main(){ init(); if(s2==0&&d[0]==0){ printf("No Solution!\n"); return 0; } if(s1==0&&c[0]==0){ printf("0\n"); return 0; } while(e1==0&&e2==0){ int l1=-1,l2=-1; for(int i=0;i<=s1;i++){ e1*=10; e1+=c[i]; if(e1>=p){ l1++; g[l1]=e1/p; e1%=p; }else if(l1!=-1){ l1++; g[l1]=0; } } for(int i=0;i<=s2;i++){ e2*=10; e2+=d[i]; if(e2>=p){ l2++; h[l2]=e2/p; e2%=p; }else if(l2!=-1){ l2++; h[l2]=0; } } s1=l1;s2=l2; for(int i=0;i<=s1;i++)c[i]=g[i]; for(int i=0;i<=s2;i++)d[i]=h[i]; } if(e2==0&&e1!=0){ printf("No Solution!\n"); return 0; } ll ans=e1%p*qpow(e2,p-2)%p; if(!w&&ans)putchar('-'); printf("%lld\n",ans); return 0;}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8829995.html

你可能感兴趣的文章
Elasticsearch学习笔记3: bulk批量处理
查看>>
EBS12.2.5 升级到EBS12.2.6的问题及跟踪处理
查看>>
网站访问流程
查看>>
java的日志工具log4j的配置方法
查看>>
jQuery on()方法
查看>>
步调一致才能得胜利
查看>>
mysql 锁机制
查看>>
add_header X-Frame-Options "SAMEORIGIN";NGINX
查看>>
linux中的计划任务
查看>>
Android style报错
查看>>
Lintcode130 Heapify solution 题解
查看>>
【Map】Map、HashMap
查看>>
解决纯数字字符串在js方法参数中不稳定或被截取的问题
查看>>
如何在VMware安装Windows系统
查看>>
阶段性理解phantomjs/selenium/casperjs
查看>>
Java中高级开发工程师是什么技术水平(附28套Java进阶+高级视频教程)
查看>>
sudo命令
查看>>
第十九章 文本处理流编辑器:awk编程
查看>>
Xtrabackup+Rsync 备份数据库并同步到远端备份机
查看>>
activiti实战读书笔记——第九章 多实例
查看>>