河神的难题
发布时间: 2017年6月23日 22:53 最后更新: 2017年6月23日 22:57 时间限制: 1000ms 内存限制: 128M
一天ycb老师高兴的走在小河边,嘴里哼着小曲,突然河神从河里跳了出来,手里拿着一本《顶级游戏设计》。
河神对ycb老师说:"孩子你想要这本书吗?"要知道ycb老师早就想要一本游戏书了,所以y老师高兴的跳了起来,大喊着:"我要我要!".
谁知河神一本正经的说:"我的书只能送给配的上它的人,我现在出个题来考考题,如果你可以答上来我就把这本书送给你好了。"
"现在给你一个字符串s,定义一个二维数组b,对于数组中的每个元素 bij=si*sj ,再给你一个整数a,问你在这个二维数组b中可以找出
多少个子二维数组使得各个元素的和加起来等于a,输出所有解的个数?"
ycb老师对于这个问题很头疼,聪明的你们能帮帮他吗?
第一行包含一个整数a (0<=a<=1e9)
第二行包含一个字符串s (1<=|s|<=600)
输出一个整数,表示所有解的个数.
16 439873893693495623498263984765
40
0 1230
19
矩阵的和等于 行值和乘以列值和,可以写几个推出来,所以就可以枚举所有的列值和,复杂度是n^2,显然列值和情况和行值和情况是一样的,对于每个列值和,求有多少种行值和等于(a/列值和),
最后在特判一下0就可以了
#include <vector>
#include <iostream>
#include <map>
using namespace std;
map <long long , long long> cnt;
int a;string s;
int main()
{
cin >> a >> s;
long long ans = 0,zero=0,flog = -1;
for(int i = 0; i < s.size(); i++) {
long long sum = 0;
for(int j = i; j < s.size(); j++) {
sum += s[j] - '0';
if(sum == 0 ) {
zero++;
continue;
}
if( a / sum != sum && a % sum == 0)
ans += 2 * cnt[a / sum];
cnt[sum]++;
}
}
for(int i = 0; i*i <= a; i++)
if(i*i == a) flog = i;
if(a==0)
cout << 2 * zero * s.size() * (1 + s.size()) / 2 - zero * zero << endl;
else
cout << ans + (flog== -1 ? 0 : cnt[flog] * cnt[flog]) << endl;
return 0;
}
实验室腊新呐
发布时间: 2017年6月23日 22:53 最后更新: 2017年6月23日 22:55 时间限制: 1000ms 内存限制: 128M
实验室要纳新了,李楚凡同学很轻松的就通过了纳新测试,被纳入实验室的同学会被分成由七位学长带领的七个小组,而这七位学长都有着各自的脾气,有各自的要求,
现在不考虑同学之间的差异,只考虑每个小组之间的数量差异,根据下面每位学长的要求,求有多少种不同分配的方案数(当两种方案里存在一个小组有着不同的数量就
可以说这两种分配方案不同)。
包老师:两眼 是独相随,我的小组人数必须是偶数。
杨老师:我是最帅的,所以我的小组人数也必须是最多的。
炸老师:我是杨老师忠粉,所以杨老师的小组人数是我的小组人数的两倍。
谭老师:理应我是最大的,但我甘心在杨老师下面,所以我的小组人数仅次于杨老师(人数只比杨老师小)。
刘老师:我的小组人数各位上的位数之和是奇数。
闫老师:我的小组人数必须是个素数。
L老师:好脾气,我的小组人数多少都可以。
李院长看到这七个死**正经事没做多少,要求倒不少,怒斥道:"你们七个小组的人数总和必须是x,并且每个小组人数都不能超过16个并且不能少于1个。"
根据上述所有要求,给出整数x,求所有的不同的方案数。
多组输入,以EOF结束
每组输入一个整数x(0<x<=112)
每组输出方案数a
14 12
1 0
七个for循环,仔细判断一下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int ans=0;
int su[6]={2,3,5,7,11,13};
int x;
int bao,yang,zhai,tan,liu,yan,l;
while(cin>>x)
{
ans=0;
for(tan=1;tan<=16;tan++)
{
for(yang=tan+1;yang<=16;yang++)
{
if(yang&1);
else
{
for(bao=2;bao<=tan;bao+=2)
{
for(liu=1;liu<=tan;liu++)
{
if(liu<10&&liu&1||liu>=10&&!(liu&1))
{
for(yan=0;yan<6;yan++)
{
if(su[yan]<=tan)
{
for(l=1;l<=tan;l++)
{
if(yang+tan+bao+yang/2+liu+su[yan]+l==x&&yang/2<=tan)
{
// cout<<bao<<" "<<yang<<" "<<yang/2<<" "<<tan<<" "<<liu<<" "<<su[yan]<<" "<<l<<endl;
ans++;
}
}
}
}
}
}
}
}
}
}
cout<<ans<<endl;
}
return 0;
}