Fence Building(取模、逆元)

https://nanti.jisuanke.com/t/28963

题意:得出公式后,//(n-1)*(n-2)*(n^2-3*n+12)/24+n    //(n*(n-1)*(n-2)*(n-3)+(n-1)*(n-2)*12+24*n)/24  ,结果取模1e9+7,

 1<=n<=10^18.

题解:计算过程中每两个运算都要取模,对于除法,取逆元

逆元:因为涉及除数,不能直接像加减乘法一样分解取模,a*x=1+mod*y; 求出x,x就是a的逆元

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 1005
#define mod 1000000007
#define LL long long
using namespace std;
LL n;
LL extgcd(LL a,LL b,LL &x,LL &y)//返回a和b的最大公约数 
{
	if(b==0)
	{
		x=1;y=0;
		return a;
	}
	LL q=extgcd(b,a%b,x,y);
	LL t=x;x=y;y=t-(a/b)*y;
	return q;
}
LL finv(LL a,LL m)//最小逆元 
{
	LL x,y;
	LL g=extgcd(a,m,x,y);
	x=(x%m+m)%m;
	return x;
}
int main()
{
	int t;
	cin>>t;
	int cnt=1;
	while(t--)
	{
		cin>>n;
		LL ans;
		ans=(((((((n%mod)*((n-1)%mod))%mod)*((n-2)%mod))%mod)*((n-3)%mod))%mod+((((((n-1)%mod)*((n-2)%mod))%mod)*12)%mod)%mod+(24*(n%mod))%mod)%mod;
		ans=(ans*finv(24,mod))%mod;
		cout << "Case #" << cnt++ << ": ";
		cout << ans << endl;
	}
	//(n-1)*(n-2)*(n^2-3*n+12)/24+n
	//(n*(n-1)*(n-2)*(n-3)+(n-1)*(n-2)*12+24*n)/24
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值