结论:

http://acm.hdu.edu.cn/showproblem.php?pid=6363

f[d]表示d|gcd(x1,x2,...,xk)的方案数

d|gcd(x1,x2,..,xk)=d|x1,d|x2,...d|x3, x1+x2+...+xk=n则

x1+x2+...+xk=n/d非负整数解

f[d]=C(n/d+k-1,k-1)

g[d]表示d=gcd(x1,x2,...,xk)的方案数

枚举gcd,为求g[d],先求f[d]因为f[d]好求,然后减去gcd的倍数

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define all(a) a.begin(),a.end()
using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;const ll mod = 1e9+7;
const int N = 2e6+6;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==0?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=1;a%=mod; if(b<0) return 1; for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll read(){ll x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
ll inv[N], f[N], fac[N];
ll a[N];
void init() {f[0] = 1; f[1] = 2;fac[0] = fac[1] = 1;inv[1]=1;rep(i, 2, N) {fac[i] = fac[i-1] * (ll)i % mod;inv[i] = kpow(fac[i], mod-2);f[i] = (f[i-1] * f[i-2]) % mod;}
}
ll C(int n, int m) {if(n < m) return 0ll;if(m==0 || n==m) return 1ll;if(n-1==m || m==1) return n;return fac[n] * inv[m] % mod * inv[n-m] % mod;
}
int main(){init();int T;scanf("%d",&T);while(T--) {int n, m;scanf("%d%d",&n,&m);mt(a, 0);ll sum = C(n+m-1, n), ans = 0;repd(g,n,1) {if(n%g==0) {ll j = n / g;a[g] = C(j+m-1,m-1) % mod;repp(k,g+g,n + 1,g) a[g] = (a[g] - a[k] + mod) % mod;ans = ans + a[g] * (f[g] - 1 + mod) % mod; ans %= mod;}}ans = ans * kpow(sum, mod-2) % mod;printf("%lld\n",ans);}return 0;
}

理论上我们只要将两者相乘,然后除于总共方案数就可以了。但是fib[g]fib[g]是一个指数级增长的函数式,所以我们需要利用欧拉函数对这个式子进行优化
欧拉函数

若(a,m)=1则aϕ(m)≡1(m)若(a,m)=1则aϕ(m)≡1(m)

所以在本题中m=109+7m=109+7

2m−1≡1(mod m)2m−1≡1(mod m)

那么

2fib[i]≡2fib[i]%(m−1)(mod m)2fib[i]≡2fib[i]%(m−1)(mod m)

本题中有关数学变化我已经全部做了较为详细的解释。我们接下来只要按照上面的思路先预处理出所有要用的值,然后分别算出来方案数和该方案对应的美丽值,然后除以总方案数就可以了

#include <bits/stdc++.h>const long long MAXN = 1000000,MOD = 1000000007; using namespace std;
long long T,ans,N,K;
long long fib[MAXN+5],fnv[2*MAXN+5],fac[2*MAXN+5],inv[MAXN],f[MAXN];vector<long long>d;inline long long powmod(long long a,long long b){long long res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;
}inline void pre(){fib[0] = 0;fib[1] = 1;inv[1] = 1;fac[0] = fnv[0] = 1;for(int i = 2;i <= MAXN;i++) fib[i] = (fib[i-1] + fib[i-2]) % (MOD - 1);for(int i = 2;i <= MAXN;i++) inv[i] = (MOD-MOD/i)*inv[MOD%i]%MOD;for(int i = 1;i<=2*MAXN;i++) {fac[i] = fac[i-1] * i % MOD;fnv[i] = fnv[i-1] * inv[i] % MOD;       }
}inline long long comb(long long a,long long b){return ((fac[a]*fnv[b])%MOD*fnv[a-b])%MOD;
}int main()
{pre();scanf("%lld",&T);while(T--){scanf("%lld%lld",&N,&K);d.clear();for(int i = 1;i <= N;i++) if(N%i == 0) d.push_back(i);for(int i = 0;i < d.size();i++) f[i] = comb(N/d[i]+K-1,K-1);for(int i = d.size()-1;i >= 0;i--)for(int j = i + 1;j < d.size();j++)if(d[j]%d[i]==0)f[i] = (f[i]-f[j]+MOD)%MOD;ans = 0;for(int i = 0;i < d.size();i++) ans=(ans+f[i]*(powmod(2,fib[d[i]])-1))%MOD;ans = ans * powmod(comb(N+K-1,K-1),MOD-2) % MOD;if(ans < 0) ans += MOD;printf("%lld\n",ans);}return 0;
} 

gcd常见结论及gcd与斐波那契结合--hdu6363.相关推荐

  1. 斐波那契数列的鬼畜的性质

    斐波那契数列的鬼畜的性质 斐波那契数列定理1 \(gcd(f[i],f[i+1])=1\) 利用辗转相减法 证明: \(gcd(f[i],f[i+1])\) \(=gcd(f[i+1]-f[i],f[ ...

  2. 斐波那契数列性质【记住】

    斐波那契数列 斐波那契数列递推 F(1)=1,F(0)=0F(1)=1,F(0)=0F(1)=1,F(0)=0 F(n)=F(n−1)+F(n−2)F(n)=F(n-1)+F(n-2)F(n)=F(n ...

  3. 烦神的斐波那契洛谷-1306-斐波那契公约数

    传送门 洛谷1306传送门 -------------------------------------------------------------------------------------- ...

  4. 2019ICPC(徐州) - Who is better?(中国剩余定理+斐波那契博弈)

    题目链接:点击查看 题目大意:给定k组a和b表示同余式,分别代表n%a=b,求出n后,代表有n个敌人,有两个人我们称为A和B,从A开始杀敌,第一次A可以杀至少一个敌人,至多n-1个敌人,接下来B与A轮 ...

  5. 斐波那契数列的性质整理

    https://www.cnblogs.com/Milkor/p/4734763.html 定义/递推式 \(F_0=0,\,F_1=1\) \(F_n=F_{n-1}+F_{n-2} \quad ( ...

  6. HDU 2814 斐波那契循环节 欧拉降幂

    一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...

  7. 洛谷 P1306 斐波那契公约数

    题意简述 求斐波那契数列第n项和第m项的最大公约数 题解思路 设斐波那契数列第x项为F[x] 则有结论\(Gcd(F[n], F[m]) = F[Gcd(n, m)]\) ============== ...

  8. 递归法 最大公倍数 斐波那契数列 数组插入排序改递归

    辗转相除法: 例如:m%n=0;能够整除则n为最大公倍数 若m%n=k,不能够整除的话,继续辗转相除变为n%k 若n%k=c,不能整除的话继续这样- 核心代码 static int gcd(int m ...

  9. 波菲那契数列公式_斐波那契数列为什么那么重要,所有关于数学的书几乎都会提到?...

    一句话先回答问题:因为斐波那契数列在数学和生活以及自然界中都非常有用. 下面我就尽我所能,讲述一下斐波那契数列. 一.起源和定义 斐波那契数列最早被提出是印度数学家Gopala,他在研究箱子包装物件长 ...

最新文章

  1. ASP.NET中WebForm组件CheckBoxList编程
  2. 30005 rust_Steam三连冠老游戏《腐蚀(RUST)》为什么突然火起来了?
  3. 北京决心一试:如何打造中国的HHMI和贝尔实验室?
  4. codevs地鼠游戏(贪心)
  5. MongoDB的简单操作
  6. [译]RabbitMQ教程C#版 - 远程过程调用(RPC)
  7. table 内 下拉列表 被遮挡_一个简洁、有趣的无限下拉方案
  8. js实现数组降维算法[不准用Array.prototype.flat的api]
  9. Java中 break continue return 的区别
  10. MySQL什么是关系_MySQL教程-关系模型
  11. word文档被锁定无法编辑的解决方法
  12. Python学习杂记_1_PyCharm使用的一些收获
  13. 操作系统实验一 进程管理
  14. super expression must either be null or a function 报错解决方法
  15. java pgm_用Java读取pgm文件
  16. 软件测试验收测试的重点是什么,实施软件验收测试的常用策略
  17. Android Q版本实现自动连接WiFi
  18. HTML-文本格式化
  19. 解决enter键Typora不能单换行的问题
  20. 【100%通过率】华为OD机试真题 C++ 实现【农场施肥】【2023 Q1 | 100分】

热门文章

  1. python装饰器带参数函数_python带参数装饰器的两种写法
  2. linux 删除文件 例外,linux 删除文件,某个文件例外
  3. python入门指南txt-pip安装和使用入门指南
  4. python软件下载-python下载_python免费下载[编程工具]-下载之家
  5. python免费教程视频-微软推出 Python 免费在线教程视频
  6. python基本代码教程-Python基础
  7. python办公自动化案例-Python实战:自动化办公:Python 自动整理 Excel 表格
  8. 学python用什么软件-零基础初学python需要安装哪些软件?希望对你们有帮助
  9. 语音识别技术的原理及研究难点
  10. ios12 siri 语音识别