牛客网【每日一题】4月29日题目精讲 Symmetric Matrix
鏈接:
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 524288K,其他語言1048576K 64bit IO Format: %lld題目描述
輸入描述:
輸出描述:
For each test case, print an integer which denotes the result.示例1
輸入
輸出
1 507109376備注:
- 1 ≤ n ≤ 105
- 1 ≤ m ≤ 109
- The sum of n does not exceed 107.
題解:
利用OEIS求解:
我們先枚舉出n=2,3,4,5,6時,答案分別是多少?
n=2 sum=1
n=3 sum=1
n=4 sum=6
n=5 sum=22
然后在OEIS直接搜1 1 6 22就會彈出這個如圖
OEIS是一個整數數列線上大全,可以利用數列中部分值查詢這個數列以及公式
(第一次用OEIS,才發現有這么一個寶貝)
根據如圖,可以得到式子
a(n)= ( n-1 ) * ( a(n - 1 ) * a( n-2 ) ) - ( n-1 ) * ( n-2 ) * a(n-3) /2
對了不要忘了mod m
具體證明:
不大會。。。
結合多篇文章,自己的理解
矩陣我們可以轉化成圖的構造,你就想想圖的那個鄰接矩陣表示法,(也就是常用的二維數組存邊)邊權值表示點與點有幾條邊
因為對稱位置值相同(題目所給),每個點都會連接兩個邊,形成環,又因為對角線為0,所以邊不可能連接自身
a[n]表示有n個點的情況
我們要做的時候,如果從a[n-1]推到a[n],也就是從n-1個點推到n個點
兩種情況:
第一種: n-1個點選出一個的點與第n個點連接形成環,其他n-2個點自由連接
(n-1)f[n-2]
第二種:n-1個點選出一個點x與第n個點連接成邊,但是暫不成環,只是單向連,然后n-1個點自由連,一定會出現空出一個點y只連接一次,再和第n個點相連
(n-1)f[n-1]
答案就是f[n]=(n-1)*( f[n-2]+f[n-1] )
但是情況二會存在重復,
因為矩陣是關于對角線對稱的,第二種情況中,咱們一開始選出的點是x,最后選出的是y,如果倒過來先選的y后選的x,最后出來的矩陣效果是一樣的,選x的方案數是n-1,選y是n-2,剩下n-3個數自由選擇,倒過來會重復,所以減去 的值要除以2
所以重復的部分是(n-1)(n-2)f[n-3]/2
最后合在一起就OK了:a(n)= ( n-1 ) * ( a(n - 1 ) * a( n-2 ) ) - ( n-1 ) * ( n-2 ) * a(n-3) /2
代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e9+7; const int maxn = 1e5 +5; ll n,m; ll f[maxn]; void init() {f[1]=0;f[2]=1;f[3]=1; } int main(){while(cin>>n>>m){init();//初始化for(ll i=4;i<=n;i++){f[i]=((i-1)*f[i-2]+(i-1)*f[i-1]-(i-2)*(i-1)/2*f[i-3])%m;}printf("%lld\n",(f[n]+m)%m);}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的牛客网【每日一题】4月29日题目精讲 Symmetric Matrix的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xboxone与PC互联互通详细说明:主
- 下一篇: 牛客网【每日一题】4月30日题目精讲 换