Codeforces 963A Alternating Sum 【数论+数学】

官方题解这个样子我觉得说得比较清楚。Z我们可以朴素的预处理出来(注意乘法膜),q的话考点在于【分数取膜】即 (a/b)%P = a* inverse of b %P

这就涉及到算b的逆元,我用的是欧几里得算法。下面这个博客写的很清楚。

http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

然后还有两个细节,一是要写快速幂这样才能 O(k * log(n)) 复杂度预处理出Z,快速幂的时候注意a的类型得是long long,因为a*a的时候可能爆int,我就因为这一点WA了好多次。第二个细节是根据等比数列求和公式我们要特判一下q=1的情况

 1 #include<iostream>
 2 #define MAXN 200000
 3 #define ll long long
 4 #define P 1000000009
 5 using namespace std;
 6
 7 int exgcd(int a,int b,int &x,int &y)
 8 {
 9     if(b==0)
10     {
11         x=1;
12         y=0;
13         return a;
14     }
15     int r=exgcd(b,a%b,x,y);
16     int t=x;
17     x=y;
18     y=t-a/b*y;
19     return r;
20 }
21
22 ll power(ll a,int n){
23     if(n==0) return 1;
24     if(n==1) return a;
25     if(n==2) return (a*a)%P;
26     if(n%2) return power(power(a,n/2),2)*a%P;
27     return power(power(a,n/2),2);
28 }
29
30
31 int n,a,b,k,s[MAXN];
32 int x,y;
33 ll sum;
34
35 int main(){
36
37 scanf("%d%d%d%d",&n,&a,&b,&k);
38
39 for(int i=0;i<k;i++){
40     char sym; cin>>sym;
41     if(sym==‘+‘) s[i]=1;
42     else s[i]=-1;
43 }
44
45 for(int i=0;i<k;i++){//Z
46     if(s[i]==1) sum=(sum+power(a,n-i)*power(b,i)%P)%P;
47     else sum=(sum-power(a,n-i)*power(b,i)%P+P)%P;
48 }
49
50 exgcd(a,P,x,y);//找a的逆元
51 int inva=x;
52 inva+=P; inva%=P;
53 ll q = power(b,k)*power(inva,k)%P;
54
55 if(q==1){
56     cout<<sum*((n+1)/k)%P;
57 }
58 else{
59     x=0; y=0;
60     exgcd(q-1,P,x,y); x+=P; x%=P;
61     printf("%d",sum*x%P*( power(q,(n+1)/k) -1 )%P );
62 }
63
64     return 0;
65 }

原文地址:https://www.cnblogs.com/ZhenghangHu/p/8973537.html

时间: 2024-08-06 06:00:34

Codeforces 963A Alternating Sum 【数论+数学】的相关文章

Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】

题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解: 其实就是要找一些数字,使得之和mod m为0. 开一个vector,存当前已经能够构成的数字之和mod m之后的值. 一开始vector为空,然后枚举n个数字a[i],对于每个数字枚举当前vector中的值v[i],将没有出现过的(a[i]+v[i])%m值加入vector中. 最后判断下vec

Codeforces 396B On Sum of Fractions 数论

题目链接:Codeforces 396B On Sum of Fractions 题解来自:http://blog.csdn.net/keshuai19940722/article/details/20076297 题目大意:给出一个n,ans = ∑(2≤i≤n)1/(v(i)*u(i)), v(i)为不大于i的最大素数,u(i)为大于i的最小素数, 求ans,输出以分式形式. 解题思路:一开始看到这道题1e9,暴力是不可能了,没什么思路,后来在纸上列了几项,突然想到高中时候求等差数列时候用到

CodeForces 449C Jzzhu and Apples 数学+素数

这道题目晚上本来就花了很多把都××了,着实觉得自己思路没错啊,回顾一下思路,给你n个数,分成两两组合一对,分成最多组如何分,但是组合的两个数 不能互素,所以呢 偶数肯定是好的了,所以先放着,先把素数给搞定,10^5所以枚举所有包含该素数因子的数,如果刚好分组则最好,不然的话其中有偶数的踢掉一个给下面的偶数处理部分,最后再处理偶数的部分,这样肯定满足组数最多,完全没有问题,后来方法确实是没问题啊,只是代码有问题,我靠!真是脑残!,今天看到一位大牛的想法,我跟他是一样的,只是代码写搓了,后来改了又改

ZOJ 3813 Alternating Sum (牡丹江网络赛E题)

ZOJ 3813 Alternating Sum 题目链接 赛后补题中,这题真心恶心爆了 先推下公式,发现是隔一个位置,长度从最长每次减2,这样累加起来的和,然后就可以利用线段树维护,记录4个值,奇数和,偶数和,奇数答案和,偶数答案和,这样pushup的时候,对应要乘系数其实就是加上左边奇(偶)和乘上右边长度,线段树处理完,还有个问题就是查询可能横跨很多个区间,这样一来就要把区间进行分段,分成3段,然后和上面一样的方法合并即可,注意中间一段很长,不能一一去合并,可以推成等差数列,利用前n项和去搞

UVA12716 GCD XOR 数论数学构造

题目给你一个N,让你求 两个数字 A,B,且   A>=B<=N,是的 gcd(A,B) == A^B N的范围是 3*10^7大的吓人一开始没敢想构造,因为就算构造开的数组也太大了,已经10^7了,后来想了半天在^运算这里也没有想出来什么,所以没办法还是大胆构造吧,构造就去按照他题目的意思来了,构造两个数字 i,j其中j是i的倍数,那么j + i与i的最大公约数肯定是i了,那么(j+i)^i == i这样构造出来的就算满足了,然后再模仿gcd辗转相除的愿意  把它们放在一个数组里计数,这样预

Codeforces 396B On Sum of Fractions 规律题

题目链接:点击打开链接 我们把 1 / { u(i)*v(i) }拆开->  (1/(u(i)-v(i)) * ( 1/v(i) - 1/u(i) ) 若n +1  是素数,则显然(1/(u(i)-v(i)) * ( 1/v(i) - 1/u(i) ) 这样完全相同的式子有 u(i)-v(i) 个 那么就可以把前面系数约掉,那么剩下的式子就是 1/2 - 1/(n+1) 若不是,则我们找到第一个<=n的素数,即v(n) 和第一个>n的素数,即 u(n) 然后前面的 2-v(n)求和,即

Codeforces 413B Spyke Chatting(数论简单)

题目链接:Codeforces 413B Spyke Chatting 题目大意:n个人,m种聊天器,k次发送消息,然后给出n*m的矩阵,如果g[i][j]为1,则表示i号人会使用j号聊天器,接着给出k次消息发送者和聊天器,如果i在j种聊天器上发送了一条消息,那么所有使用j种聊天器的人都会接受到消息.现在要求每个人会接受到几条消息,自己发送的不算. 解题思路:分别记录每个聊天器上有多少个消息,以及每个人发送了多少条消息,然后计算每个人接受到多少条消息的时候只要将这个人所使用的各个聊天器消息数取和

zoj 3813 Alternating Sum(线段树)

题目链接:zoj 3813 Alternating Sum 题目大意:给定一个P,S是以P为循环的无限串,定义G(i,j),现在有两种操作: 1 x d:将P中x的位置变为d 2 l r:查询S中l-r之间所有的G(i, j)的和 解题思路:线段树的区间查询点修改. 根据G(i,j)的公式可以推导出:每次查询l~r这段区间的答案为: 奇数:sl?len+sl+2?(len?2)+sl+4?(len?4)+?+sr?1 偶数:sl?len+sl+2?(len?2)+sl+4?(len?4)+?+s

CodeForces - 344D Alternating Current (模拟题)

CodeForces - 344D Alternating Current Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description Mad scientist Mike has just finished constructing a new device to search for extraterrestrial intelligence! H