NKOI 3503 数列[6月月赛题D]
2016-06-06 19:10
344 查看
数列
Description
数列a的满足,给出n,,x,y,求模100000007后的结果。Input
输入文件shu.in第1行包含4个整数n,,x,y。
Output
输出文件shu.out只有1行包含1个整数,模100000007后的结果。
Sample Input
样例输入1:1000 333 1 233
样例输入2:
100 2 3 3
Sample Output
样例输出1:233333
样例输出2:
63011400
Hint
对于10%的数据,x=0。对于另10%的数据,x=1。
对于另10%的数据,y=0。
对于另20%的数据,n<=10000000。
对于另30%的数据,y%(x-1)=0。
对于100%的数据,n在long long范围内,,x,y在int范围内。
对数论的基础要求比较高的题
分析了数列我们应该想到:
第一:对于x=0的情况,直接输出答案,如果n=0输出a0,否则输出y。
第二:对于x=1的情况,其实就是等差数列,直接求通项公式。
第三:对于y=0的情况,其实就是等比数列,直接求通项公式,用二分快速幂算答案。
第四:对于n<=10000000的情况,直接逐项递推。
第五:前面用了这么多通项公式,其实就是暗示你直接求通项公式。对于y%(x-1)=0的情况,直接求出通项公式再用
二分快速幂算答案。
第六:对于一般的情况。
#include<iostream> #define LL long long using namespace std; LL n,a,x,y,ans; const int mod=100000007; LL doub(LL x,LL y){ L 4000 L ans=1LL; x%=mod; while(y){ if(y&1)ans=ans*x%mod; y>>=1; x=x*x%mod; } return ans; } void adg(LL i,LL j,LL &x,LL &y){ if(j==0){x=1LL,y=0LL;return;} adg(j,i%j,y,x); y-=i/j*x; return; } int main(){ LL xx,yy; cin>>n>>a>>x>>y; a%=mod; x%=mod; y%=mod; if(x!=1&&x!=0){ a=(((x-1)*a%mod+y)%mod*doub(x,n%(mod-1))%mod-y+mod)%mod; adg(x-1,mod,xx,yy); if(x<0)x+=mod; ans=a*xx%mod; } else if(x==1)ans=(a+n*y)%mod; else if(x==0) if(n==0)ans=a; else ans=y; cout<<(ans+mod)%mod; }
相关文章推荐
- 关于验收测试的几个困惑
- Linux下Tomcat重新启动
- L1-004. 计算摄氏温度
- 谷歌借Google Play重返中国,这次能成功吗?
- MySQL备份锁
- Android开发.9图制作
- 数据结构与算法 推荐的好书
- 微信支付将向境外商户全面开放 支持九种外币
- 亲子日记(三)
- 软件工程
- scala之trait详解三:延时绑定
- Ubuntu 安装mysql和简单操作
- IOS UISearchController的简单开发实现(swift版)
- Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
- 细说五层网站架构
- *1
- 负载均衡算法
- POJ2188
- h.264语法结构分析
- android 根据Item数设定ListView高度