CometOJ contest#13「火鼠的皮衣 -不焦躁的内心-」(单位根反演)

给定 n , a , b , p n,a,b,p n,a,b,p,求
∑ i = 0 n 2 a i b n − i ∗ 2 ( n 2 ∗ i ) \sum_{i=0}^{\frac{n}{2}}a^ib^{n-i*2}\binom{n}{2*i} i=02naibni2(2in)
指数不相同,丑陋
∑ i = 0 n 2 a i ∗ 2 b n − i ∗ 2 ( n 2 ∗ i ) \sum_{i=0}^{\frac{n}{2}}\sqrt a^{i*2}b^{n-i*2}\binom{n}{2*i} i=02na i2bni2(2in)
直接枚举 i ∗ 2 i*2 i2
∑ i = 0 n a i b n − i ( n i ) [ 2 ∣ i ] \sum_{i=0}^{n}\sqrt a^{i}b^{n-i}\binom{n}{i}[2|i] i=0na ibni(in)[2i]
单位根反演
∑ i = 0 n a i b n − i ( n i ) ∑ j = 0 1 w 2 i j 2 = ∑ i = 0 n a i b n − i ( n i ) 1 + w 2 i 2 \sum_{i=0}^{n}\sqrt a^{i}b^{n-i}\binom{n}{i}\frac{\sum_{j=0}^1w_2^{ij}}{2}=\sum_{i=0}^{n}\sqrt a^{i}b^{n-i}\binom{n}{i}\frac{1+w_2^i}{2} i=0na ibni(in)2j=01w2ij=i=0na ibni(in)21+w2i
= 1 2 ( ∑ i = 0 n a i b n − i ( n i ) + ∑ i = 0 n ( a w 2 1 ) i b n − i ( n i ) ) =\frac{1}{2}(\sum_{i=0}^{n}\sqrt a^{i}b^{n-i}\binom{n}{i}+\sum_{i=0}^{n}(\sqrt a w_2^1)^{i}b^{n-i}\binom{n}{i}) =21(i=0na ibni(in)+i=0n(a w21)ibni(in))
= 1 2 ( ( a + b ) n + ( b − a ) n ) =\frac{1}{2}((\sqrt a+b)^n+(b-\sqrt a)^n) =21((a +b)n+(ba )n)

直接带复数进行运算,两个算出来实部正好相等, 1 2 \frac{1}{2} 21 的系数消掉,算一个的实部即可


orz cyk

#include<bits/stdc++.h>
#define cs const
using namespace std;
typedef long long ll;
ll n, A, B, p; int T;
ll add(ll a, ll b){ return (a + b) % p; }
ll mul(ll a, ll b){ return (a*b - (ll)((long double)a/p*b) * p + p) % p; }
struct node{
	ll x, y;
	node(ll _x = 0, ll _y = 0){ x = _x; y = _y; }
	node operator + (cs node &a){ return node(add(x, a.x), add(y, a.y)); }
	node operator - (cs node &a){ return node(add(x, p-a.x), add(y, p-a.y)); }
	node operator * (cs node &a){ return node(add(mul(x, a.y), mul(y, a.x)), add(mul(A, mul(x,a.x)), mul(y, a.y))); }
};
int main(){
	scanf("%d", &T);
	while(T--){
		scanf("%lld%lld%lld%lld", &n, &A, &B, &p); A = A % p; B = B % p;
		node now(1, B), ans(0, 1);
		for(;n;n>>=1, now=now*now) if(n&1) ans=ans*now;
		cout << ans.y << '\n'; 
	} return 0; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值