2 条题解

  • -1
    @ 2026-9-7 14:28:01

    楼下的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
    上传者