序列求和(gcd與逆元)

  • 註釋:Cii+Ci+1i+...+Cni=Cn+1i+1\small C_i^i+C_{i+1}^i+...+C_n^i=C_{n+1}^{i+1}
  • 題面
  • 題意:見題面。
  • 解決思路:結論:12+22+32+...+n2=n(n+1)(2n+1)6\small 1^2+2^2+3^2+...+n^2=\large\frac{n(n+1)(2n+1)}{6}
    證明
    i2=i2+ii=i(i1)+i=2Ci2+Ci1\small \because i^2=i^2+i-i=i(i-1)+i=2C_i^2+C_i^1
    12+22+...+n2=1+2(C22+...+Cn2)+(C21+...+Cn1)=2(C22+...+Cn2)+(C11+C21+...+Cn1)\small \therefore 1^2+2^2+...+n^2=1+2(C_2^2+...+C_n^2)+(C_2^1+...+C_n^1)=2(C_2^2+...+C_n^2)+(C_1^1+C_2^1+...+C_n^1)
    12+22+...+n2=2Cn+13+Cn+12=(n+1)n(n1)3+(n+1)n2=n(n+1)(2n+1)6\small \therefore 1^2+2^2+...+n^2=2C_{n+_1}^3+C_{n+1}^2=\large\frac{(n+1)n(n-1)}{3}\small+\large\frac{(n+1)n}{2}\small=\large\frac{n(n+1)(2n+1)}{6}
    證畢
    直接上下用gcd\small gcd約分就好了。
    或者可以用逆元求解分母。
  • AC代碼
//優化
#pragma GCC optimize(2)
//C
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//C++
#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<istream>
#include<iomanip>
#include<climits>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
//宏定義
#define N 1010
#define DoIdo main
//#define scanf scanf_s
#define it set<ll>::iterator
#define TT template<class T>
//定義+命名空間
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1e9 + 7;
const ll INF = 1e18;
const int maxn = 1e6 + 10;
using namespace std;
//全局變量
//函數區
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
//主函數
int DoIdo() {

	ios::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);

	ll n;
	while (cin >> n) {
		ll a = n, b = n + 1, c = 2 * n + 1;
		ll val = 6, g = gcd(a, val);
		a /= g, val /= g; g = gcd(b, val);
		b /= g, val /= g; g = gcd(c, val);
		c /= g, val /= g;

		a %= mod, b %= mod, c %= mod;
		cout << (((a * b) % mod) * c) % mod << endl;
	}
	return 0;
}
//分割線---------------------------------QWQ
/*



*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章