NC219167. 小Q与构造
描述
输入描述
一行三个整数 ,意义如上。
输出描述
一行一个整数,表示能够构造出的数据数对 取模的值。
示例1
输入:
4 2 2
输出:
8
说明:
一共有 种合法的样例,分别是 。示例2
输入:
1000 5 10
输出:
4076068
示例3
输入:
1000000 40 8
输出:
8055001
C++(clang++11) 解法, 执行用时: 9ms, 内存消耗: 860K, 提交时间: 2021-04-12 14:25:06
#include <stdio.h> #include <assert.h> typedef long long LL; const LL mod = 10086001; LL n,k,p; LL f[64]; LL g[64][1024]; void preprocess(){ g[0][0] = 1; f[0] = 1; for(int i=1;i<=60;i++){ for(int S=0;S<(1<<p);S++){ if(S&1){ if(S&2) continue; g[i][S] = g[i-1][S>>1]; }else{ g[i][S] = (g[i-1][S>>1]+g[i-1][S>>1|(1<<(p-1))])%mod; } f[i] = (f[i]+g[i][S])%mod; } } } LL qpow(LL bsc,LL y){ LL ret = 1; bsc %= mod; while(y){ if(y&1) ret = ret*bsc%mod; bsc = bsc*bsc%mod; y >>= 1; } return ret; } LL count(LL l,LL r){ return (r-l)-r/k+l/k; } int main(){ scanf("%lld%lld%lld",&n,&k,&p); if(k==1){ puts("1"); return 0; } preprocess(); LL ans = 1; for(LL x=1,r=n,M=1;r!=0;x++,M*=k){ LL l=n/(M*k); ans = ans*qpow(f[x],count(l,r))%mod; r = l; } printf("%lld\n",ans); return 0; }