2 条题解
-
-1
楼下的int128虽然很有脑,但还是太吃操作了,居然还要用快读(不会快读的同学感到很赞)我觉得可以在操作的时候强转int128然后输出的时候再转回来就可以了(除非输入输出也超过long long)代码如下:
using namespace std; typedef long long ll; __int128 solve(__int128 a,__int128 b,__int128 p){ return (a%p)*(b%p)%p; } int main(){ ll a,b,p; cin>>a>>b>>p; ll res=(ll)solve((__int128)a,(__int128)b,(__int128)p); cout<<res; return 0; }然后给出一个龟速乘的正常做法: (感觉没什么好讲的就和快速幂差不多)
#include<bits/stdc++.h> using namespace std; typedef long long ll; //核心思想:将乘法转化为加法。利用b的二进制展开,例如a*13=a*8+a*4+a*1 ll solve(ll a,ll b,ll p){ ll ans=0; for(;b;b>>=1){//当b>0时循环,每次循环b右移一位(相当于b/=2) if(b&1)ans=(ans+a)%p;//检查b的最低位是否为1,如果为1,则将当前的a累加到结果中,并取模防止溢出 a=a*2%p;//底数翻倍 } return ans; } int main(){ ll a,b,p; cin>>a>>b>>p; cout<<solve(a,b,p); return 0; }这是本蒟蒻发的第一篇题解,各位dalao、老师多多包涵QwQ
信息
- ID
- 823
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 19
- 已通过
- 10
- 上传者