zoukankan      html  css  js  c++  java
  • 序列求和_逆元的运用/是什么_(逆元/模运算/数据范围)

    链接:https://ac.nowcoder.com/acm/problem/15950
    来源:牛客网
    miku赛高
    题目描述
    定义S(n) = 12 + 22 + … + n2,输出S(n) % 1000000007。

    注意:1 < n < 1e18。 //这里的n必须要使用longlong

    输入描述:
    多组输入,输入直到遇到EOF为止;

    第一行输入一个正整数n。
    输出描述:
    输出S(n) % 1000000007的结果。
    示例1
    输入

    1
    2
    1000
    

    输出

    1
    5
    333833500
    

    思想:

    平方和运用数学公式
    平方和==(n*(n+1)(2n+1))/6;
    我们可以注意到题目中需要mod,对于乘法的mod我们是没有问题。
    但是在公式中有个 /6 需要处理。除法的mod怎么办呢?
    这时候就需要逆元登场了,把除转化成乘的形式

    下面引用下另一个博主的文章
    ——————————————分割线————————————————
    对于整数a,m如果存在整数b ,满足ab=1(mod m),那么称b是a的模m 乘法逆元。

    比如说要你求A/B%C等于多少,但是存在除法取模问题(因为(A/B)%C != (A%C)/(B%C),而对于乘法却有(AB)%C != (A%C)(B%C)

    所以要把A/B%C==>A*(1/B)%C 转换成A*X%C的形式,现在就是如何求X。(X在乘法上是B的逆元,意思是我们用B的逆元取代1/B就行了)这样就解决了乘法取模问题
    ——————————————分割线————————————————
    详情:https://blog.csdn.net/weixin_42373330/article/details/84202849

    另附 模运算:
    (a + b) % p = (a % p + b % p) % p (1)
    (a - b) % p = (a % p - b % p) % p (2)
    (a * b) % p = (a % p * b % p) % p (3)
    a ^ b % p = ((a % p)^b) % p (4)

    模一定也要模到位,不然数据后面数据大会wa;

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<string>
    #include<algorithm>
    
    #define ll  long long 
    using namespace std;
    const ll mod = 1000000007;
    
    
    ll extgcd(ll a, ll b, ll &x, ll &y) {    //扩展欧几里得;计算a%b,a关于b的逆元X,b关于a的逆元Y 
    	ll d = a;
    	if (b == 0) {
    		x = 1;
    		y = 0;
    	}
    	else {
    		d = extgcd(b, a % b, y, x);
    		y -= a / b * x;
    	}
    	return d;   //返回a%b 
    }
    ll inv(ll a,ll mod){   //求a对mod的逆元 
    	ll x, y;
    	ll d = extgcd(a, mod, x, y);
    	if (d != 1)
    		return -1;
    	else
    		return (x + mod) % mod;
    
    }
    
    int main()
    {
    	ll n;
    	while (cin>>n)
    	{
    		ll ans = 0;
    		ans = ((((n % mod) * ((n + 1) % mod)) % mod) *((2 * n + 1) % mod)) % mod;
    		ll inv_6 = inv(6, mod);//表示6%mod的逆元
    		ans = (ans%mod*inv_6%mod) % mod;
    		cout << ans << endl;
    
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    UVa LA 2965
    UVa LA 3695
    UVa LA 3029 City Game 状态拆分,最大子矩阵O(n2) 难度:2
    Uva LA 3177
    Uva LA 3902
    Uva 11520
    UVa Live 3635
    python学习笔记-day05 字典
    python学习笔记-day04 元组
    python学习笔记 day04 列表增删改查
  • 原文地址:https://www.cnblogs.com/gidear/p/11773629.html
Copyright © 2011-2022 走看看