問題描述
克拉克是一名人格**患者。某一天,克拉克變成了乙個研究人員,在研究數字。
他想知道在所有長度在[l, r][l,r]之間的能被77整除且相鄰數字之和不為kk的正整數有多少個。
[l, r][l,r]之間的能被77整除且相鄰數字之和不為kk的正整數有多少個。
輸入描述
輸出描述第一行乙個整數t(1 \le t \le 5)t(1≤t≤5),表示資料的組數。
t(1 \le t \le 5)t(1≤t≤5),表示資料的組數。每組資料只有一行三個整數l, r, k(1 \le l \le r \le 10^9, 0 \le k \le 18)l,r,k(1≤l≤r≤109,0≤k≤18)。
每組資料只有一行三個整數l, r, k(1 \le l \le r \le 10^9, 0 \le k \le 18)l,r,k(1≤l≤r≤109,0≤k≤18)。
每組資料輸出一行乙個數,表示答案。由於答案太大,你只需對10^9+7109+7取模即可。
10^9+7109+7取模即可。
輸入樣例
2
1 2 5
2 3 5
輸出樣例
13
125
hint
第乙個樣例有13個數滿足,分別是:7,21,28,35,42,49,56,63,70,77,84,91,987,21,28,35,42,49,56,63,70,77,84,91,98
7,21,28,35,42,49,56,63,70,77,84,91,987,21,28,35,42,49,56,63,70,77,84,91,98
定義dp[i][j][k]表示位數為i,當前數%7的值而且以k結尾的方案數。
先列出dp方程,dp[i][x][ (t*10+x)%7 ]+=dp[i-1][j][t],因為i太大,所以要用矩陣快速冪加速。
#include #define ll long long
#define mod 1000000007
using namespace std;
typedef vectorvec;
typedef vectormat;
mat mul(mat &a,mat &b)
return b;
} int main()
} }
for(int i=0;i<=9;++i) //求字首和必加,本題較於下題加這個的原因在於長度可以是1~l/1~r,下題只能是固定長度
a[70][i]=1; //求字首和必加,後面這個i(0~9)是指最終狀態可能性(餘數0,末位0~9)
a[70][70]=1; //求字首和必加
aa=pow(a,l-1);
bb=pow(a,r);
ll s1=0,s2=0;
for(int i=1;i<=9;++i)
cout<<(s2-s1+mod)%mod<[topcoder]給出n,k,計算 1k + 2k + 3k + ... + nk modulo 1000000007.
要實現求和長度在k左右的遞推式(n+1)^k-n^k=sigma(c[k][i]*n^i);
#include#define ll long long
#define mod 1000000007
using namespace std;
ll cc[55][55];
void permut()
for(int i=2;i<=50;++i)
return b;
} int main()
} //求字首和必加
for(int i=0;i<=k;++i)
a[k+1][i]=cc[k][i]; //這一步不理解(為什麼加的是cc[k][i])
a[k+1][k+1]=1;
b[0][0]=1;
a=pow(a,n);
b=mul(a,b);
cout
#include #define ll long long
#define mod 1000000007
using namespace std;
typedef vectorvec;
typedef vectormat;
mat mul(mat &a,mat &b)
return b;
} int num[11];
int main()
mat a(x+2,vec(x+2));
mat b(x+2, vec(1));
for(int i=0;i【快速冪變形】cd484c 一般做法會超時,但很難想到快速冪
//思路:首先 他是對1到k 元素做一次變換,然後對2到k+1個元素做一次變化。。。。依次做完。
// 如果我們對1到k個元素做完一次變換後,把整個陣列迴圈左移乙個。
// 那麼第二次還是對1 到 k個元素做和第一次一樣的變換,再左移,
// 再對1 到 k個元素做和第一次一樣的變換,依次做完n-k+1即可。
// 假設題目要求的變換為c 迴圈左移變換為p。那麼對於每次查詢 相當於做 n-k+1 cp)變換。
// 最後把答案再向右移動k-1 回到原來位置即可。
// 那麼問題就解決了 效率 每次查詢n log(n-k+1)
#includeusing namespace std;
char s[1000005];
char a[1000005];
int p[1000005];
int ans[1000005];
int tmp[1000005];
int main()
for(int j=0;j【poj3613】從s到e恰好經過n條邊的最短路(可以有重邊)。
#include#include#include#includeusing namespace std;
int n,t,s,e,num;
mapmp;
struct matrix
};matrix floyd(matrix a,matrix b)
matrix solve(matrix a,int k)
a=floyd(a,a);
k>>=1;
}return ans;
}int main()
a=solve(a,n-1); // n 條邊 ,經過 n-1 個點
printf("%d\n",a.ma[mp[s]][mp[e]]);
}return 0;
}
快速冪(矩陣快速冪)
求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...
快速冪 矩陣快速冪
快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...
快速冪 矩陣快速冪
快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...