2017 Multi-University Training Contest - Team 10 HDU-6172:Array Challenge
2017-08-28 14:02
316 查看
Array Challenge
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 153428/153428K (Java/Others)
Total Submission(s): 393 Accepted Submission(s): 206
Problem Description
There’s an array that is generated by following rule.
h0=2,h1=3,h2=6,hn=4hn−1+17hn−2−12hn−3−16
And let us define two arrays bnandan as
below.
bn=3hn+1hn+9hn+1hn−1+9h2n+27hnhn−1−18hn+1−126hn−81hn−1+192(n>0)
an=bn+4n
Now, you have to print ⌊√(an)⌋ ,
n>1.
Your answer could be very large so print the answer modular 1000000007.
Input
The first line of input contains T (1 <= T <= 1000) , the number of test cases.
Each test case contains one integer n (1 < n <= 1015)
in one line.
Output
For each test case print ⌊√(a_n )⌋ modular 1000000007.
Sample Input
3
4
7
9
Sample Output
1255
324725
13185773
官方题解:http://bestcoder.hdu.edu.cn/blog/
√(a_n )=h(n+1)+h(n)-6*h(n-1)+8;即矩阵快速幂;
#include<bits/stdc++.h> using namespace std; const long long MOD=1000000007; struct lenka { long long a[4][4]; }; lenka cla(const lenka& a,const lenka& b) { lenka c; memset(c.a,0,sizeof c.a); for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { for(int k=0;k<4;k++) { c.a[i][j]+=a.a[i][k]*b.a[k][j]; c.a[i][j]=(c.a[i][j]+MOD)%MOD; //负数取模 } } } return c; } long long POW(long long n) { if(n==3)return 31; n-=4; lenka res,a,ans; memset(res.a,0,sizeof res.a); memset(a.a,0,sizeof a.a); memset(ans.a,0,sizeof ans.a); for(int i=0;i<4;i++)res.a[i][i]=1; a.a[0][0]=4,a.a[0][1]=1; a.a[1][0]=17,a.a[1][2]=1; a.a[2][0]=-12; a.a[3][0]=-16,a.a[3][3]=1; while(n) { if(n%2)res=cla(res,a); a=cla(a,a); n/=2; } ans.a[0][0]=190,ans.a[0][1]=35,ans.a[0][2]=6,ans.a[0][3]=1;//初始化为h4,h3,h2 ans=cla(ans,res); return (((ans.a[0][0]+ans.a[0][1])%MOD-6*ans.a[0][2])%MOD+8ll+MOD)%MOD; //注意取模 } int main() { int T;cin>>T; while(T--) { long long n; cin>>n; cout<<POW(n+1)<<endl; } return 0; }
相关文章推荐
- HDU 6172 Array Challenge(打表+矩阵快速幂)——2017 Multi-University Training Contest - Team 10
- HDU-6178 Monkeys - 2017 Multi-University Training Contest - Team 10(树形DP)
- 2017 Multi-University Training Contest 10 1002 Array Challenge HDU 6172(找规律 矩阵快速幂)
- HDU-6181 Two Paths(2017 Multi-University Training Contest - Team 10)
- HDU-6033 Add More Zero - 2017 Multi-University Training Contest - Team 1(水之崩心态题)
- hdu 6034 Balala Power!(贪心)( 2017 Multi-University Training Contest - Team 1 )(无耻之sort)
- HDU 6038 Function(找规律)——2017 Multi-University Training Contest - Team 1
- HDU-6103 Kirinriki - 2017 Multi-University Training Contest - Team 6(尺取)
- hdu 6047 Maximum Sequence(2017 Multi-University Training Contest - Team 2)
- hdu 6045 Is Derek lying?(2017 Multi-University Training Contest - Team 2)
- hdu 6055 Regular polygon(判断正方形)(2017 Multi-University Training Contest - Team 2)
- 2017 Multi-University Training Contest - Team 1 HDU 6033 Add More Zero【对数】
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest - Team 4 )
- hdu 6070 Dirt Ratio(二分+线段树)(2017 Multi-University Training Contest - Team 4 )
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
- hdu 6073 Matching In Multiplication(2017 Multi-University Training Contest - Team 4 )
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
- hdu 6034 Balala Power!(贪心)( 2017 Multi-University Training Contest - Team 1 )(无耻之sort)