BZOJ 2326: [HNOI2011]数学作业
2016-04-02 11:38
363 查看
还以为有什么奥妙重重的数学公式
结果没想到是矩乘……
结果没想到是矩乘……
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int m; struct matrix{ ll a[3][3]; void print(){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++) printf("%lld ",a[i][j]); putchar('\n'); } } void clear(){memset(a,0,sizeof(a));} matrix(){clear();} matrix operator * (matrix b){ static matrix ans; ans.clear(); for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++) ans.a[i][j]+=a[i][k]*b.a[k][j]; for(int i=0;i<3;i++) for(int j=0;j<3;j++) ans.a[i][j]%=m; return ans; } matrix operator ^ (ll k){ static matrix ans,b; ans.clear(); for(int i=0;i<3;i++)ans.a[i][i]=1; memcpy(b.a,a,sizeof(a)); for(;k;k>>=1,b=b*b)if(k&1)ans=ans*b; return ans; } }f,g; int calc(ll n){ f.a[0][2]=1; g.a[1][0]=g.a[1][1]=g.a[2][0]=g.a[2][1]=g.a[2][2]=1; ll l=1,k=10%m; while(true){ ll r=l*10-1; if(r>n)r=n; g.a[0][0]=k; f=f*(g^(r-l+1)); if(r==n)break; k=k*10%m; l=r+1; } return f.a[0][0]; } int main(){ //freopen("a.in","r",stdin); ll n;scanf("%lld%d",&n,&m); printf("%d\n",calc(n)); return 0; }
相关文章推荐
- Linux _ pthread 线程 信号
- 219. Contains Duplicate II
- CF 626 B. Cards
- 有关素数的基础算法
- leetcode之Roman to Integer
- 数据库层级结构实现
- 网络:用 socket 做简单聊天
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线
- Latex overline断开连续字母上横线