题意:求1^1+2^2+3^3+4^4+....对7取模
分析:先把底数对7取模,得出1^1+1^8+1^15+...+2^2+2^9+2^16+...
然后就可以分成7组,分别用矩阵加速计算结果,关键就在矩阵的构造了
结果右上角的就是答案,其中n为底为i的项的个数
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
char s[7][20]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
struct Matrix {
int a[2][2];
};
Matrix multiply(Matrix x,Matrix y){
int i,j,k;
Matrix ret;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
ret.a[i][j]=0;
for(k=0;k<2;k++){
ret.a[i][j]+=(x.a[i][k]*y.a[k][j])%7;
ret.a[i][j]%=7;
}
}
}
return ret;
}
void quick_pow(Matrix &ans,Matrix &tmp,int y){
while(y){
if(y&1){
ans=multiply(ans,tmp);
}
tmp=multiply(tmp,tmp);
y>>=1;
}
}
int power(int x,int y){
int ret=1;
while(y){
if(y&1)
ret=ret*x%7;
x=x*x%7;
y>>=1;
}
return ret;
}
int main()
{
Matrix tmp,ans;
int t,n,sum,i,c,num;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
sum=0;
for(i=1;i<=7;i++){
ans.a[0][0]=ans.a[0][1]=power(i,i)%7;
ans.a[1][0]=ans.a[1][1]=0;
tmp.a[0][0]=tmp.a[0][1]=power(i,7)%7;
tmp.a[1][0]=0;tmp.a[1][1]=1;
num=n/7;
if(n%7>=i)
num++;
if(num>0){
num--;
quick_pow(ans,tmp,num);
sum=(sum+ans.a[0][1])%7;
}
}
printf("%s\n",s[sum]);
}
return 0;
}