博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4700 算
阅读量:6247 次
发布时间:2019-06-22

本文共 1142 字,大约阅读时间需要 3 分钟。

P4700 算
时间: 1000ms / 空间: 125829120KiB / Java类名: Main

背景

zhx和他的妹子出去玩。

描述

请在此填写题目描述

输入格式

仅一行,包含两个数N和M.

输出格式

仅一行,包含所求的答案mod 10^9 + 7的值。

【样例输入】

3 3

【样例输出】

56

备注

对于 50%的数据,所有1≤N,M≤1000。

对于100% 的数据,所有1≤N,M≤50000 。

题解:

等比数列:{a,aq1,aq2,aq3,aq4,aq5...aqn,...}

     前m项的前缀和:s=a(1-qm)/(1-m);

费马小定理:若p为质数,ap-1%p=1

逆元:若ax%p=1(p为质数),则a,x互为逆元

则ans=sigma(1,n)q(1-qm)/(1-m)

由于同余定理不支持除法,逆元处理:

  ans=sigma(1,n)q(1-qm)/(1-q)mod-2

考虑到负数问题

  ans=sigma(1,n)q(qm-1)/(q-1)mod-2

最终

  ans=sigma(1,n)q(qm-1)/(q-1)mod-2

代码:

#include
#include
#define ll long longusing namespace std;const ll mod=1e9+7;ll n,m;inline ll fpow(ll a,ll p){ ll res=1; for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod; return res%mod;}inline void solve(){ ll ans=n; for(ll i=2,tmp,s;i<=n;i++){ /*自己推的*/ //tmp=fpow(i,m+1); //s=((tmp-1+mod)%mod)*fpow(i-1,mod-2)%mod; //ans=(ans+s-1+mod)%mod; /*学哥讲的等比数列*/ tmp=i*(fpow(i,m)-1)%mod; s=fpow((i-1),mod-2); ans=(ans+tmp*s%mod)%mod; }//应该是都对 cout<
>n>>m; solve(); return 0;}

 

转载于:https://www.cnblogs.com/shenben/p/5859782.html

你可能感兴趣的文章
swift学习第五章-字典的使用
查看>>
我的编程之路(十五) 需求的变更
查看>>
关于递归方法的实现
查看>>
js中的with语句
查看>>
crontab用法
查看>>
【转】基于LDA的Topic Model变形
查看>>
wordpress之备份与恢复数据
查看>>
[LeetCode] Combination Sum
查看>>
Android中Menu的基本使用方法
查看>>
微信公众平台开发(107) 分享到朋友圈和发送给好友
查看>>
推荐系统
查看>>
Appium安装过程
查看>>
Cocos2d-X中间应用
查看>>
Android学习笔记之SoftReference软引用...
查看>>
MFC office2007风格设置左侧导航栏 [转]
查看>>
swift:入门知识之泛型
查看>>
Git技巧:右键菜单怎么去除?
查看>>
【iCore3 双核心板_FPGA】例程四:Tcl脚本实验——配置引脚
查看>>
C4D to Unity3D插件C2U Tool开源发布!简化你的工作流
查看>>
【NLP】基于自然语言处理角度谈谈CRF(二)
查看>>