2021年百度之星初赛二--签到(取模问题)


任意门

Problem Description
给 a,b ,每次 a,b 会变为 a+b,a−b ,问 k 次之后变成了哪两个数,对 998244353 取模,多组数据。
Input
第一行一个正整数 T(1≤T≤100000) ,代表测试组数。

接下来 T 行每行三个数 a,b,k(0≤a,b<998244353,0≤k≤109) 。

Output
T 行每行两个整数,代表每一组数据 a,b 最后变成了什么。

Sample Input
2
2 1 5
5 5 100

Sample Output
12 4
329904920 329904920

这一道题用到了取模的方法!接下来就来介绍一下吧!

  • 取模问题往往是在所运算的结果过于庞大的情况下,整型已经无法储存,所以这个时候用到取模

  • 但是我们取模的时候肯定不是(a+b)%p这样子来,因为a+b会造成溢出,所以,我们用以下公式:

  • (a + b) % p = (a%p + b%p) %p
    (a - b) % p = ((a%p - b%p) + p) %p
    (a * b) % p = (a%p)*(b%p) %p

快速幂算法模板1

typedef long long LL;
LL pow_mod(LL a,LL b,LL p){//快速幂取模
    LL ans=1,base=a;
    while(b>0){
        if(b&1) //n%2==1
        //判断是否是奇数,是奇数的话将多出来的数事先乘如sum
            ans=ans*base%p;
        base=base*base%p;
        b>>=1;// b/=2
        // 不断的两两合并再取模,减小a和b的规模
    }
    return ans;
}

1&1=1,其他的操作都为0

快速幂模板2

long long Mode(long long a, long long b, long long mode)
{
	long long sum = 1;
	while (b) {
		if (b & 1) {
			sum = (sum * a) % mode;
			b--;
		}
		b /= 2;
		a = a * a % mode;
	}
	return sum;
}

那么这里就是找规律,然后取模!

代码

#include <iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int mod=998244353;

long long _pow(long long  a,long long b){
	long long ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}
int main() {
	int n;
	scanf("%d",&n);
	while(n--){
		long long a,b,k;
		scanf("%lld%lld%lld",&a,&b,&k);
		long long x,y,z=(k+1)/2-1;
		if(k&1){
			x=_pow(2,z)*(a+b)%mod;
			y=_pow(2,z)*(a-b+mod)%mod;
		}else{
			x=2*_pow(2,z)*a%mod;
			y=2*_pow(2,z)*b%mod;
		}
		printf("%lld %lld\n",x,y);
		
	}
    return 0;
}


感觉自己的转换成代码的能力比较弱,就是自己找到了规律之后,也要花一定的时间来转化成代码,不是很迅速,然后在取模的时候,取模也不是取得很好!望改进!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值