HDU 4669 Mutiples on a circle 不知道该归为哪一类。
2024-08-25 09:00:25
题意:给你N个珠宝和一个K,每个珠宝上面都有数字,这个珠宝做成项链,把珠宝上的数字拼起来如果可以整除掉K,那么久说这个数字为wonderful value,问你有多少种方案可以组成WONDERFUL VALUE。
对每个数取余并记录多少位,这样的话拼数的时候好操作。详细解法贴个结题报告吧。
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int dp[][];
int a[];
int len[];
int decmod[<<];
int digit(int a)
{
int len = ; while(a)
{
a /= ;
len++;
} return len;
}
void getdecmod(int k,int n)
{
decmod[] = ;
int i;
for(i = ;i <= n<<;i++)
{
decmod[i] = (decmod[i-]*)%k;
}
}
int main()
{
int n,k; while(~scanf("%d %d",&n,&k))
{
int j,i;
for(i = ;i <= n;i++)
scanf("%d",&a[i]),a[i+n] = a[i];
getdecmod(k,n);
for(i = ;i <= n;i++)
{
for(j = ;j < k;j++)
dp[i][j] = ;
}
int r ;
for(i = ;i <= n;i++)
{
len[i+n] = len[i] = digit(a[i]);
r = a[i] = a[i+n] = a[i]%k;
dp[i][r]++;
} r = a[];
int sublen = ;
for(i = n;i > ;i--)
{
sublen += len[i+];
r = (a[i]*decmod[sublen]+r)%k;
dp[][r]++; }
sublen = ;
for(i = ;i<= n;i++)
sublen += len[i];
int last;
last = r;
// printf("%d--------------\n",last);
__int64 ans = dp[][];
for(i = ;i <= n;i++)
{
for(j =;j < k;j++)
{
r = (j*decmod[len[i]]+a[i])%k;
dp[i][r] += dp[i-][j];
}
last = (last*decmod[len[i]]+a[i])%k;
dp[i][last]--;
last = (last-(a[i]*decmod[sublen])%k+k)%k;
ans += dp[i][];
} printf("%I64d\n",ans);
}
}
最新文章
- Mroonga 3.0.8 发布,MySQL 存储引擎
- DataTables 入门使用
- memcpy函数的使用方法
- [转载]mininet的安装和使用
- PyDev下PyQt 的尝试
- 【m从翻译os文章】写日志禁令Sqlnet.log和Listener.log
- 『HTMl5』学习日志
- nginx、fastCGI、php-fpm关系梳理
- [经典] 使用Python批量重命名iPhone拍摄的照片-按照拍摄时间重命名
- mysql 最左匹配 联合索引
- Egret EUI的学习
- 【xsy1300】 原题的旅行 最短路+倍增
- statistics_level 参数的应用
- 详解MySQL大表优化方案
- php 升级后 htmlspecialchars 返回空 的解决方案
- poj_1456 贪心
- c#文件下载---以文件流形式
- iOS-常用宏定义
- CF 1006B Polycarp&#39;s Practice【贪心】
- 为多个文件夹下的C源代码编写Makefile文件