CF1097D Makoto and a Blackboard 质因数分解 DP
2024-09-01 04:48:59
题意:
给定一个n,每次随机把n换成它的因数,问经过k次操作,最终的结果的期望。
思路:
一个数可以表示为质数的幂次的积。所以对于这个数,我们可以分别讨论他的质因子的情况。
假设质因子x的指数是j,那么这个质因子下一步可以变到的情况就有(j+1)种可能,利用概率DP算出k步操作后每个x的不同幂次的概率,然后求出期望。
把每个质因子的情况算出来的期望乘起来即可。
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert> using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c);
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
}
/*-----------------------showtime----------------------*/
const int maxn = 1e4+;
ll dp[maxn][],inv[];
ll n; int k; ll cal(ll a,int n){
memset(dp, , sizeof(dp));
dp[][n] = ; for(int i=; i<k; i++){
for(int j=; j<=n; j++){
for(int t=; t<=j; t++){
dp[i+][t] =(dp[i+][t] + dp[i][j] * inv[j+]%mod)%mod;
}
}
} ll d = ,sum = ;
for(int i=; i<=n; i++){
sum = (sum + d * dp[k][i])%mod;
d = d * a % mod;
} return sum;
} int main(){
cin>>n>>k;
ll ans = ;
inv[] = ;
for(int i=; i<=; i++){
inv[i] = (mod - mod/i)*inv[mod%i]%mod;
} for(ll i=; i*i<=n; i++){
if(n%i==){
int cnt = ;
while(n%i==) n/=i,cnt++;
ans = ans * cal(i, cnt)%mod;
}
}
if(n>) ans = ans * cal(n, )%mod;
cout<<ans<<endl;
return ;
}
最新文章
- C# 可视化读取文件、文件夹
- jdk环境变量配置
- Appium移动自动化测试之获取appPackage和appActivity
- (二)cordova+framework7入门——笑笑APP
- error C2783: 无法为“T”推导 模板 参数
- [Node.js] Node.js Buffers
- gulp配置browserify多入口
- OC中没有实现NSCopying技术时的深复制技术
- html标签全称和功能介绍
- 201521123022 《Java程序设计》 第二周学习总结
- echarts纵坐标使用科学计数法表示
- [PHP] 数据结构-输出链表倒数第k个结点PHP实现
- nginx location 匹配的规则
- docker-compose.yml样例(mysql主从+mycat读写分离)
- 7. python 字符串格式化方法(2)
- OTL翻译(7) -- otl_exception类
- 一次完整的http请求全程
- oracle 数据导入和导出(原创)
- 在eclipse下使用maven的配置
- 高级软件测试技术(测试管理工具实践day3)