P3216-[HNOI2011]数学作业【矩阵乘法,数学】
生活随笔
收集整理的這篇文章主要介紹了
P3216-[HNOI2011]数学作业【矩阵乘法,数学】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problemnew/show/P3216
題目大意
求1~n1\sim n1~n連起來%m\% m%m之后的值。
解題思路
我們可以考慮矩乘,但是當xxx位數時每次乘上10x10^x10x,所以我們對于不同位分開處理就好了。
codecodecode
#include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; const int Size=4; struct matrix{ll a[Size][Size]; }f,a; ll n,m,k,pn,z; matrix operator *(matrix &a, matrix &b) {matrix c;memset(c.a,0,sizeof(c.a));for (ll i=0;i<Size;i++)for (ll j=0;j<Size;j++)for (ll k=0;k<Size;k++)(c.a[i][j]+=a.a[i][k]*b.a[k][j]%m)%=m;return c; } ll pows(ll x,ll b) {ll ans=1;while(b){if(b&1) ans=ans*x%m;x=x*x%m;b>>=1;}return ans; } void make_matrix(ll k) {memset(a.a,0,sizeof(a.a));a.a[0][0]=z*10%m;a.a[1][0]=1;a.a[2][1]=1;a.a[1][1]=1;a.a[2][2]=1;f.a[0][1]=z%m;f.a[0][2]=1; } void power(ll b) {/*while(b--)f=f*a;*/while(b){if(b&1) f=f*a;a=a*a;b>>=1;} } int main() {scanf("%lld%lld",&n,&m);pn=n;k=0;z=1;while(n){k++;make_matrix(k);if(n/10)power(z*10-z);elsepower(pn-z+1);n/=10;z*=10;}printf("%lld",f.a[0][0]); }總結
以上是生活随笔為你收集整理的P3216-[HNOI2011]数学作业【矩阵乘法,数学】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一周食谱安排表 根据营养安排一周菜谱
- 下一篇: nssl1304-最大正方形【二分答案】