Math Magic


Time Limit: 3 Seconds       Memory Limit: 32768 KB

Yesterday, my teacher taught us about math: +, -, *, /, GCD, LCM... As you know, LCM (Least common multiple) of two positive numbers can be solved easily because of a * b = GCD (a, b) * LCM (a, b).

In class, I raised a new idea: "how to calculate the LCM of K numbers". It's also an easy problem indeed, which only cost me 1 minute to solve it. I raised my hand and told teacher about my outstanding algorithm. Teacher just smiled and smiled...

After class, my teacher gave me a new problem and he wanted me solve it in 1 minute, too. If we know three parameters N, M, K, and two equations:

1. SUM (A1, A2, ..., Ai, Ai+1,..., AK) = N 
2. LCM (A1, A2, ..., Ai, Ai+1,..., AK) = M

Can you calculate how many kinds of solutions are there for Ai (Ai are all positive numbers). I began to roll cold sweat but teacher just smiled and smiled.

Can you solve this problem in 1 minute?

Input

There are multiple test cases.

Each test case contains three integers N, M, K. (1 ≤ N, M ≤ 1,000, 1 ≤ K ≤ 100)

Output

For each test case, output an integer indicating the number of solution modulo 1,000,000,007(1e9 + 7).

You can get more details in the sample and hint below.

Sample Input

4 2 2
3 2 2

Sample Output

1
2

Hint

The first test case: the only solution is (2, 2).

The second test case: the solution are (1, 2) and (2, 1).

这题时间卡的真紧啊!

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
#define MAXN 1005
#define mod 1000000007
int lca[MAXN][MAXN],dp[2][MAXN][MAXN],vec[MAXN];
int gcd(int a,int b)
{
if(a==0)return b;
return gcd(b%a,a);
}
int main()
{
int n,m,k,i,j,now,no,k1,j1,ans,ii;
for(i=1;i<=1000;i++)
for(j=i;j<=1000;j++)
lca[j][i]=lca[i][j]=i/gcd(i,j)*j;
while(scanf("%d%d%d",&n,&m,&no)!=EOF)
{
now=0;
//memset(dp,0,sizeof(dp));
ans=0;
vec[ans++]=1;
for(i=2;i<=m;i++)
{
if(m%i==0)
vec[ans++]=i;
}
for(ii=0;ii<=n;ii++)
for(j=0;j<ans;j++)
dp[now][ii][vec[j]]=0;
dp[now][0][1]=1;
for(i=0;i<=no-1;i++)
{
now=now^1;
for(ii=0;ii<=n;ii++)
for(j=0;j<ans;j++)
dp[now][ii][vec[j]]=0;
for(j=i;j<=n;j++)
for(int j2=0;j2<ans;j2++)
{
k=vec[j2];
if(dp[now^1][j][k]==0)
continue;
for(int jj1=0;jj1<ans;jj1++)
{ j1=vec[jj1];
if(j1+j>n)
break;
k1=lca[k][j1];
if(k1>m||m%k1!=0)
continue;
dp[now][j1+j][k1]+=dp[now^1][j][k]; dp[now][j1+j][k1]%=mod;
}
} }
printf("%d\n",dp[now][n][m]%mod);
}
return 0;
}

zoj3662Math Magic的更多相关文章

  1. Codeforces CF#628 Education 8 D. Magic Numbers

    D. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. [8.3] Magic Index

    A magic index in an array A[0...n-1] is defined to be an index such that A[i] = i. Given a sorted ar ...

  3. Python魔术方法-Magic Method

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...

  4. 【Codeforces717F】Heroes of Making Magic III 线段树 + 找规律

    F. Heroes of Making Magic III time limit per test:3 seconds memory limit per test:256 megabytes inpu ...

  5. 2016中国大学生程序设计竞赛 - 网络选拔赛 C. Magic boy Bi Luo with his excited tree

    Magic boy Bi Luo with his excited tree Problem Description Bi Luo is a magic boy, he also has a migi ...

  6. 一个快速double转int的方法(利用magic number)

    代码: int i = *reinterpret_cast<int*>(&(d += 6755399441055744.0)); 知识点: 1.reinterpret_cast&l ...

  7. MAGIC XPA最新版本Magic xpa 2.4c Release Notes

    New Features, Feature Enhancements and Behavior ChangesSubforms – Behavior Change for Unsupported Ta ...

  8. Magic xpa 2.5发布 Magic xpa 2.5 Release Notes

    Magic xpa 2.5發佈 Magic xpa 2.5 Release Notes Magic xpa 2.5 Release NotesNew Features, Feature Enhance ...

  9. How Spring Boot Autoconfiguration Magic Works--转

    原文地址:https://dzone.com/articles/how-springboot-autoconfiguration-magic-works In my previous post &qu ...

随机推荐

  1. Scrapy学习篇(三)之创建项目

    创建项目 创建项目是爬取内容的第一步,之前已经讲过,Scrapy通过scrapy startproject <project_name>命令来在当前目录下创建一个新的项目. 下面我们创建一 ...

  2. FastReport.Net使用:[9]多栏报表(多列报表)

    方法一:使用页的列属性(Page Columns) 1.绘制报表标题 2.设置页的列数量为3,其他默认不变.报表设计界面便如下呈现. 3.报表拷贝前面[分组]报表的内容. 4.就这么简单,一张多栏报表 ...

  3. HDU 1011 Starship Troopers 树形+背包dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1011   题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...

  4. [BZOJ 4719] 天天爱跑步

    Link: BZOJ 4719 传送门 Solution: 感觉求LCA又有了新姿势啊:$Tarjan$离线$O(n+m)$ 每次递归返回时将子树和父节点合并,如果询问节点已访问过则LCA就是已合并的 ...

  5. Nginx 502 Bad Gateway 解决方法

    proxy_next_upstream error timeout invalid_header http_500 http_503;或者尝试设置:large_client_header_buffer ...

  6. hdu 4276 树形dp

    题意:给你n个点,n-1条边构成树,每条边有边权(表示走每条边的时间),每个点有点权,问在时间T从点1走到点n,能够得到最多的点权有多少. 题目链接:点我 由于是树,最优的结果一定经过最短路,其他边要 ...

  7. java-银行卡基本信息查询

    用于验证的请求接口: https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo= ...

  8. bzoj 2152

    /************************************************************** Problem: 2152 User: idy002 Language: ...

  9. 80.Vigenère密码(模拟)

    Vigenère密码(文件名vigenere.cpp   vigenere.in    vigenere.out) 题目描述 Description 16 世纪法国外交家Blaise de Vigen ...

  10. eclipse.ini 文件使用说明

    http://wiki.eclipse.org/Eclipse.ini Overview Eclipse startup is controlled by the options in $ECLIPS ...