神仙。
考慮這個迴圈小數的迴圈節為\(l\)。
那麼有\[\frac-\left\lfloor\dfrac\right\rfloor=\frac-\left\lfloor\dfrac\right\rfloor
\]\[x-\left\lfloor\dfrac\right\rfloor*y=xk^l-\left\lfloor\dfrac\right\rfloor*y
\]\[x=xk^l\ mod \ y
\]\[k^l=1 \ mod\ y
\]根據數論知識可得\((k,y)==1\)。
然後我們設\(f(n,m,k)\)表示答案。
\[f(n,m,k)=\sum_^n\sum_^m [(i,j)==1][(j,k)==1]
\]\[\sum_^n\sum_^m[(i,j)==1]\sum_\mu(d)
\]\[\sum_^n\sum_^m[(i,jd)==1]\sum_\mu(d)
\]\[\sum_\mu(d)\sum_^n\sum_^}(i,jd)==1
\]\[\sum_\mu(d)\sum_^n\sum_^}[(i,j)==1][(i,d)==1]
\]\[\sum_\mu(d)f(\frac,n,d)
\]然後就可以做了。
注意邊界:\(m\)或n為\(0\)時值為\(0\),當\(d=1\)的時候就除法分塊一下。
#include#define n 6000009
using namespace std;
typedef long long ll;
const int maxn=6000000;
vectorvec[2002];
bool vis[n];
int prime[n],mu[n],n,m,k;
inline ll rd()
while(isdigit(c))
return f?-x:x;
}struct node
for(int j=1;j<=prime[0]&&(i*prime[j])<=maxn;++j)
mu[i*prime[j]]=-mu[i];
}} for(int i=1;i<=n;++i)mu[i]+=mu[i-1];
}inline int getsum(int n)
return rec[n]=ans;
}inline ll work(int n,int m,int k);
if(mp.find(x)!=mp.end())return mp[x];
ll ans=0;
if(k==1)
} else
} return mp[x]=ans;
}int main()
} printf("%lld",work(n,m,k));
return 0;
}
P1587 NOI2016 迴圈之美
求 sum limits n sum limits m frac 在 k 進製下能表示成迴圈節從第一位小數開始的無限迴圈小數或整數的最簡分數個數。先思考怎麼轉換。首先肯定滿足 gcd x,y 1 假設 frac 的迴圈節長度為 l 根據在 k 進製下的數乘以 k p 相當於將小數點往後挪 p 位,那...
NOI2016 優秀的拆分
看到題目,資料範圍有點怪異。對於95 的資料,對於100 的資料,意思是只有5分是正解。好吧,95pts的 很明顯,答案就是 而如何才能拿到100pts呢?我們可以先列舉a段的長度,很明顯每個長度為lcp,與往後求lcs,若 這樣就可以通過 include include include inclu...
NOI2016 優秀的拆分
題目實際上要求我們求從每個點出發的aa串的數量 考慮點i的答案,發現如果字首i與字首j j i 的最長公共字尾 i j,那麼i點出發向前就存在乙個長度為i j的aa串,題目即求對於每個字首,有多少個在他之前的字首滿足條件 考慮字尾自動機,由於每個字首都是字尾自動機parent樹上的一點,即兩個字首的...