A Simple Math ProblemTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6500 Accepted Submission(s): 3989 Problem Description Lele now is thinking about a simple function f(x). Input The problem contains mutiple test cases.Please process to the end of file.
Output For each case, output f(k) % m in one line.
Sample Input 10 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
Sample Output 45 104 |
解析:
矩阵快速幂。稍微推一下就出来了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=12;
int n,mod;
int ans[Max],a[Max][Max];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void print(int x)
{
if(x>9) print(x/10);
putchar('0'+x%10);
}
inline void mul(int ans[Max],int a[Max][Max])
{
int c[Max];
memset(c,0,sizeof(c));
for(int j=1;j<=10;j++)
for(int k=1;k<=10;k++)
c[j]=(c[j]+ans[k]*a[k][j])%mod;
memcpy(ans,c,sizeof(c));
}
inline void mulself(int a[Max][Max])
{
int c[Max][Max];
memset(c,0,sizeof(c));
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
for(int k=1;k<=10;k++)
c[i][j]=(c[i][j]+a[i][k]*a[k][j])%mod;
memcpy(a,c,sizeof(c));
}
inline void solve(int n)
{
while(n)
{
if(n&1) mul(ans,a);
n>>=1;
mulself(a);
}
}
int main()
{
while(~scanf("%d%d",&n,&mod))
{
memset(a,0,sizeof(a)),memset(ans,0,sizeof(ans));
if(n<10) {print(n),putchar('\n');continue;}
for(int i=1;i<=10;i++) ans[i]=10-i;
for(int i=1;i<=10;i++) a[i][1]=get_int();
for(int i=1;i<=10;i++) a[i][i+1]=1;
solve(n-9);
print(ans[1]),putchar('\n');
}
return 0;
}