记录编号 437817 评测结果 AAAAAAAAAA
题目名称 [HNOI 2011] 数学作业 最终得分 100
用户昵称 Gravatar天亮说晚安· 是否通过 通过
代码语言 C++ 运行时间 0.016 s
提交时间 2017-08-14 18:48:06 内存使用 0.31 MiB
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;

ll n,m,ans[4][4],shu;
ll a[4][4],wei,tot,oola;

inline void cheng(ll aa[4][4],ll bb[4][4],ll to[4][4]){
     ll tmp[4][4]={0};
     for(int i=1;i<=3;i++)
       for(int j=1;j<=3;j++)
         for(int u=1;u<=3;u++)
           tmp[i][j]=(tmp[i][j]+aa[i][u]*bb[u][j]%m)%m;
     for(int i=1;i<=3;i++)
       for(int j=1;j<=3;j++)
          to[i][j]=tmp[i][j];
}

inline ll qpow(ll x,ll ci){
     x=x%m;  ll sum=1;
     while(ci){
	    if(ci&1) sum=sum*x%m;
	    ci=ci>>1;
	    x=x*x%m;
	 }
	 return sum;
}

inline ll oula(ll x){
	 ll num=x;
	 for(ll i=2;i*i<=num;i++)
	    if(x%i==0){
		    num=num-num/i;
		    while(x%i==0) x=x/i;
		}
     if(x>1) num=num-num/x;
	 return  num;
}

int main(){
freopen("mathwork.in","r",stdin);
freopen("mathwork.out","w",stdout);
     scanf("%lld%lld",&n,&m);
     ll p=n;    shu=1;    oola=oula(m);
	 while(p){wei++;p=p/10;}
     for(int i=1;i<=wei;i++){
     	 memset(a,0,sizeof(a));
     	 memset(ans,0,sizeof(ans));
     	 shu*=10;
		 a[2][1]=a[2][2]=a[3][1]=a[3][2]=a[3][3]=1;
	     a[1][1]=shu%m;  ans[1][1]=ans[2][2]=ans[3][3]=1;
	     ll q=shu-shu/10,oo=q;
		 if(i==wei) q=n-shu/10+1,oo=q;
		 while(q){
		    if(q&1) cheng(a,ans,ans);
		    q=q>>1;
		    cheng(a,a,a);
		 }
		 tot=(tot*qpow(10,(ll)(oo%oola*i+oola))%m+ans[2][1]*((shu/10-1)%m)%m+ans[3][1])%m;
	 }
	 if(tot<0)  tot+=m;
	 printf("%lld",tot);
}